C/C++ 预处理之 define

define 是 C/C++ 中的一条预处理指令,# 用在一行的开始表示一个预处理指令的开始;一条预处理指令以回车作为结束符,而不是以分号,分号会被替换掉。

#define M 4  //把 M 定义为 4

#define Max(a,b)  (a) > (b) ? (a) : (b) //定义表达式,而不是定义函数。所有的 define 预处理都只是起替换作用

#define Max (a,b)  (a) > (b) ? (a) : (b) //注意宏名与宏参数之前不能有空格。这种写法一般是错误的,因为它把 Max 替换为 (a,b) (a) > (b) ? (a) : (b) ,一般在编译时期会报错

一般 define 指令里面会出现 # 和 ##,前一个是将传入的参数的名字作为参数的值,后一个用于连接参数的名字


#define STR(str) (#str) //以传入的参数的名字作为字符串的值,printf("%s\r\n",STR(lizhihao)) 输出 lizhihao

#define CONS(a,b,c)   (a##b##c)  //连接三个参数的名字,printf("%s\r\n",CONS(2,3,4)) 输出 234


当 define 定义中含有 # 或 ## 时,传入的宏不会被展开,而直接将表达式的名字作为值,如:

STR(CONS(a,b,c))  等于字符串  "CONS(a,b,c)"

CONS(STR(A),STR(B),STR(B)) 等价于字符串 "STR(A),STR(B),STR(B)" 

要解决这一问题,只需要用隔板宏即可,在中间多一个宏将这种效果去除。

#define _STR(str) (#str)

#define STR(str) _STR(str) //现在 STR 的定义中不含 # 或 ## ,因此,传入这个宏定义的宏会被展开

#define _CONS(a,b,c)   (a##b##c) 

#define CONS(a,b,c) _CONS(a,b,c)


再使用

STR(CONS(a,b,c)) 便等于字符串 "abc",而不是 "CONS(a,b,c)"

STR(CONS(STR(A),B,C)) 等于字符串 ""A"BC ",注意这个字符串中, A 的左右有双引号。这是因为 STR(A) 就是一个字符串,当 CONS 接收参数时,编译器知道,STR(A)是一个字符串,故此时要读它的值,而不是读变量名,当然,此时它也没有变量名,为了与传入的其它参数 b , c 相区分,以说明 STR(A) 是一个字符串,故特意在它的值的左右加双引号,而后面的 b,c 直接以其名字作为字符串的值。

类似的道理:

STR(STR(A)) 等于 "\"A\"" 这个字符串, A 左右有双引号。





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值