"#"
"#"的作用是将标记转换为字符串
例:
#define add(x) printf("%s = %d \n",#x,x)
add(4+4) 将会输出4+4 = 16 #x就表示4+4
"##"
"##"运算符是把两个语言符号组合成一个语言符号
例:
#define format(n) n##_##元
format(5) 展开将会是 5_元
当##在参数中时意义不同
另外在define func(fmt, args...)printf(fmt, ##args)
宏定义中,##的作用是当func()传递的只有一个参数时,
这时宏定义展开多出来一个"," ,##的作用就是消除这个多余的逗号,当传递的参数多余两个时,##不起作用。
"..."
"..."表示有多个参数
例:
define func(fmt, args...)printf(fmt, ##args)
define func(fmt, ...)printf(fmt, ##__VA_AGRS__)
二者是等效的,其中"..."表示可变参数的含义,而__VA_ARGS__
是一个可变参数的宏,很少人知道这个宏,
这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)
ANSI C标准中常用的几个标准预定义宏
__LINE__
:在源代码中插入当前源代码行号;
__FILE__
:在源文件中插入当前源文件名;
__DATE__
:在源文件中插入当前的编译日期
__TIME__
:在源文件中插入当前编译时间;