宏定义中的#,##,#@,\符号用法

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语言中“##“的用法:第二节

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值