宏定义中 可变参数的使用以及# ## 的使用

1、宏定义中的可变参数通常有下列两种方式,在windows中,只支持第一种,而Linux下,两种都支持。

 #define MyPrint1(level,fmt,...) if(level > 1) printf(fmt,__VA_ARGS__); //使用宏定义__VA_ARGS__来引用可变参数

 #define MyPrint2(level,fmt.arg...)  if(level >1) printf(fmt,arg);

2、在宏定义中有时候会使用到“#”以及“##”操作符。

2.1“#”后面直接跟参数,将参数“字符串化”,相当于将参数外部加了一个双引号“”;如果是在可变参数中使用该符号,将将整个可变参数上双引号。示例如下:

#define Myprint3(level,buf) if(level > 1) printf("Myprint3 %s",#buf);
#define MyPrint4(level,fmt,arg...) if(level>1) printf("MyPrint4 %s",#arg);

2.2 在说“##”之前,先说一下宏定义中的分隔符。在宏定义后半部分中,预处理器把"##"本身是作为一种分隔符来使用的的,也就是遇到分隔符的时候,把每一段和前半部分的定义进行比较,如果有在前面定义的则予以替换,否则作为字符串和另一部分相连接。但是连接以后的字符串整体是作为一个变量的名字,而非字符串来看待。示例如下:

#define MyPrint3(a,b) printf("MyPrint3  %s",a##b);

 

你可能感兴趣的:(C/C++)