1、字符串化操作符(#):给参数x
加双引号
作用: 将宏定义中传入的参数名转换成用一对双引号括起来的字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。
用法:
#define ToString(x) #x
char* str = ToString(123132); // 就成了str="123132";
2、连接操作符(##):
作用: 将两个参数按字面值连接成一个参数
用法:
#define Conn(x,y) x##y
int n = Conn(123,456); // 结果就是n=123456;
char* str = Conn("asdf", "adf") // 结果就是 str = "asdfadf";
3、字符串为空时删除前置“,” (##):
3.1、不使用##:
// 宏定义
#define LOG(_STRING, ...) printf(__STRING, __VA_ARGS__)
//宏使用
int count = 2;
log_info("cout something");
log_info("cout count: %d", count);
//宏展开
printf("cout something",); // 此处多一个,
printf("cout count: %d", count);
3.2、使用##:
// 宏定义
#define LOG(_STRING, ...) printf(__STRING, ##__VA_ARGS__)
//宏使用
int count = 2;
log_info("cout something");
log_info("cout count: %d", count);
//宏展开
printf("cout something"); // 正常
printf("cout count: %d", count);
当使用##__VA_ARGS__
时,如果__VA_ARGS__
是一个空字符串,则前面的","
会一并被删除掉。
4、字符化操作符(#@):给参数x
加上单引号
作用: 将单字符参数转换成字符,结果返回是一个const char。
用法:
#define ToChar(x) #@x
char a = ToChar(1); // 结果就是a=‘1’;
5、行继续操作符(\):
作用: 宏定义中,一行写不下时,利用反斜杠“\”进行换行,反斜杠后不能有空格。
用法:
#define ABC(AA,BB) \
cout<<AA<<endl; \
cout<<BB<<endl;
参考资料:
1、#define宏定义中的#,##,@#,\ 这些符号的神奇用法
2、define宏定义中的#,##,@#及\符号
3、C语言中“##“的用法:第二节