在我们平时的开发工程中,会经常使用到宏,它功能强大,用的好会带来意想不到的妙用。今天来整理下一些常见的用法,方便回顾。
***************************************************************************************************************************
#:将其后面的宏参数进行字符串化操作(Stringfication)
- #运算符用于在预处理期将宏参数转换为字符串
- 在预处理期完成,因此只在宏定义中有效
- 编译器不知道#的转换作用
注意:
a、忽略传入参数名前面和后面的空格。
b、当传入参数名间存在空格时,编译器将会自动连接各个子字符串,用每个子字符串之间以一个空格连接,忽略剩余空格。
c、如果#后的参数本身也是一个宏的话,#会阻止这个宏的展开,解决方法也很简单,加多一层中间转换宏,加这层宏的用意就是把所有宏的参数在这层里全部展开。
***************************************************************************************************************************
##:被称为连接符(concatenator),用来将两个Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量。
- ##运算符用于在预处理期粘连两个标识符,转换成一个实际参数名
- 在预处理期完成,因此只在宏定义中有效
- 编译器不知道##的连接作用
注意:
a、当用##连接形参时,##前后的空格可有可无。
b、连接后的实际参数名,必须为实际存在的参数名或是编译器已知的宏定义。
c、如果##后的参数本身也是一个宏的话,##会阻止这个宏的展开,解决方法也很简单,加多一层中间转换宏,加这层宏的用意就是把所有宏的参数在这层里全部展开。
***************************************************************************************************************************
#@:将传入单字符参数名转换成字符,以一对单引号括起来。
***************************************************************************************************************************
\ :续行符,当定义的宏不能用一行表达完整时,可以用“\”表示下一行继续此宏的定义,注意 \ 前留空格。
***************************************************************************************************************************
可变参数宏:
C99编译器标准允许定义可变参数宏(variadic macros),可变参数宏就像下面这个样子:
#define debug(...) printf(__VA_ARGS__)
缺省号代表一个可以变化的参数表。使用保留名 __VA_ARGS__ 把参数传递给宏。当宏的调用展开时,实际的参数就传递给 printf()了。
注意:
如果缺省号之前有逗号,就要写成下面的形式:
#define DEBUG(format, ...) printf (format, ##__VA_ARGS__)
“## ”的意思是,如果可变参数被忽略或为空,将使预处理器(preprocessor)去除掉它前面的那个逗号。
***************************************************************************************************************************
编译器内置的宏定义:
ANSI C的标准预定义宏:
__DATE__ : 以“月 日 年”的格式替换为当前日期,类型为字符串
__FILE__ : 替换为当前源文件名包括路径,类型为字符串
__LINE__ : 替换为当前行号,可以结合#line进行设置,#line之后的数字代表#line下一行的行号,之后行号以此类推,类型为整型值
__STDC__ : 当要求程序严格遵循ANSI C标准时该标识被赋值为1
__TIME__ : 以“时:分:秒”的格式替换为当前时间,类型为字符串
__TIMESTAMP__ : 以”星期 月 日 时:分:秒 年“的格式替换为最后一次修改当前源文件的时间,类型为字符串
***************************************************************************************************************************