#define TEST(param) #paramchar *pStr=TEST(123);printf(“pSrt=%s\n”,pStr);//输出结果为字符 ”123“

##运算符

##运算符也可以用在替换文本中,它的作用起到粘合的作用,即将两个宏参数连接为一个数

#define TEST(param1,param2) (param1##param2)int num =TEST(13,59);printf(“num=%d\n”,num);//输出结果为:num=1359

VA_ARGS

作用主要是为了方便管理软件中的打印信息。在写代码或DEBUG时通常需要将一些重要参数打印出来,但在软件发行的时候不希望有这些打印,这时就用到可变参数宏了。

# define PR(。..) printf(_VA_ARGS_)2 PR(“hello world\n”);34 输出结果:hello world

2 一些建议虽然宏定义很灵活,并且通过彼此结合可以产生许多变形用法,但是C++/C程序员不要定义很复杂的宏,宏定义应该简单而清晰。

宏名采用大写字符组成的单词或其缩写序列,并在各单词之间使用“_”分隔。

如果需要公布某个宏,那么该宏定义应当放置在头文件中,否则放置在实现文件(.cpp)的顶部。

不要使用宏来定义新类型名,应该使用typedef,否则容易造成错误。

给宏添加注释时请使用块注释(/* */),而不要使用行注释。因为有些编译器可能会把宏后面的行注释理解为宏体的一部分。

尽量使用const取代宏来定义符号常量。

对于较长的使用频率较高的重复代码片段,建议使用函数或模板而不要使用带参数的宏定义;而对于较短的重复代码片段,可以使用带参数的宏定义,这不仅是出于类型安全的考虑,而且也是优化与折衷的体现。

尽量避免在局部范围内(如函数内、类型定义内等)定义宏,除非它只在该局部范围内使用,否则会损害程序的清晰性。