c++define用法
c++中define用法
define在c++语言中用法比较多,这里对其进行整理。
1.无参宏定义
无参宏的宏名后不带参数。 其定义的一般形式为:
#define 标识符 字符串
其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。 例如:
#define MAXNUM 99999
这样MAXNUM就被简单的定义为99999。
2.有参宏定义
C++语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。 对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。 带参宏定义的一般形式为:
#define 宏名(形参表) 字符串
在字符串中含有各个形参。在使用时调用带参宏调用的一般形式为:宏名(实参表); 例如:
#define add(x, y) (x + y)int main()
{
cout << "1 plus 1 is " << add(1, 1.5) << ".\n";
system("pause");
return(0);
}
这个“函数”定义了加法,但是该“函数”没有类型检查,有点类似模板,但没有模板安全,可以看做一个简单的模板。
注意:该“函数”定义为(a + b),在这里加括号的原因是,宏定义只是在预处理阶段做了简单的替换,如果单纯的替换为a + b时,当你使用5 * add(2, 3)时,被替换为5 * 2 + 3,值为13,而非5 * (2 + 3),值为25。
3.宏定义中的特殊操作符define 中的特殊操作符有#,##和… and __VA_ARGS__ (1)#假如希望在字符串中包含宏参数,ANSI C允许这样作,在类函数宏的替换部分,#符号用作一个预处理运算符,它可以把语言符号转化程字符串。例如,如果x是一个宏参量,那么#x可以把参数名转化成相应的字符串。该过程称为字符串化。
例如:
#incldue <stdio.h>#define PSQR(x) printf("the square of" #x "is %d.\n",(x)*(x))int main(void)
{
int y =4;
PSQR(y);
PSQR(2+4);
return0;
}
(2)##
##运算符可以用于类函数宏的替换部分。另外,##还可以用于类对象宏的替换部分。这个运算符把两个语言符号组合成单个语言符号。 例如:
#include <stdio.h>#define XNAME(n) x##n#define PXN(n) printf("x"#n" = %d\n",x##n)int main(void)
{
int XNAME(1)=12;
PXN(1);return0;
}
(3)可变参数宏 …和__VA_ARGS__
__VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。 实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。这样预定义宏__VA_ARGS__就可以被用在替换部分中,替换省略号所代表的字符串。
例如:
#definedefine的基本用法 PR(...) printf(__VA_ARGS__)int main()
{
int wt=1,sp=2;
PR("hello\n");
PR("weight = %d, shipping = %d",wt,sp);
return0;
}
省略号只能代替最后面的宏参数。 #define W(x,…,y)错误! 但是支持#define W(x, …),此时传入的参数个数必须能够匹配。
这里再介绍几个系统的宏:
1) __VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。宏前面加上##的作用在
于,当可变参数的个数为0时,这里的##起到把前面多余的”,”去掉的作用,否则会编译出错, 你可以试试。 2) __FILE__ 宏在预编译时会替换成当前的源文件名 3) __LINE__宏在预编译时会替换成当前的行号 4) __FUNCTION__宏在预编译时会替换成当前的函数名称
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论