C/C++ 宏定义的常见使用

在我们平时的开发工程中,会经常使用到宏,它功能强大,用的好会带来意想不到的妙用。今天来整理下一些常见的用法,方便回顾。

***************************************************************************************************************************

#:将其后面的宏参数进行字符串化操作(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__ : 以”星期  月  日  时:分:秒 年“的格式替换为最后一次修改当前源文件的时间,类型为字符串

***************************************************************************************************************************

发布了46 篇原创文章 · 获赞 74 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/u010977122/article/details/89416520