小知识:C语言宏定义中 # 和 ## 符号的用法

在某些C语言代码中,有时我们可能会看到宏定义中带有#、##,这些符号有特殊的作用,下面我们用几个简单的例子来说明。

1)一个#的作用

一个#的作用就是把后面的参数当做一个字符串,也就是说等同于把后面的宏变量加上双引号:

运行上述代码,可以得到输出:

Hello world 1

Hello world 2

说明 #define  PRINT(NAME)  printf(#NAME)这个宏,等同于把NAME加上了双引号“”,即替换成了“NAME”,所以,第一个PRINT可以直接把括号内的内容打印出来。

有些地方会提到#@符号,可以把后面的宏变量字符化,也就是说加上单引号’’,但是不推荐使用这个符号,主要是很多平台下都不支持。

2)两个##的作用

两个##是连接符,即把两个宏变量拼接到一起,看下面的例子:

定义了两个宏LINK和POWER,LINK直接把两个宏变量拼接起来,所以n等于1234;POWER把两个宏变量和e顺次拼接,所以n2等于2e3,也就是等于2000。

3)使用注意

#和##在宏定义中使用时,它后面的参数如果也是一个宏,那么是不会展开的。如下面的例子:

这段代码是会编译报错的,LINK(A,B)这句只会展开成AB,而不会再往下一层把A、B也展开成12、34。由于AB是未定义的,所以编译报错。

解决办法是再定义一个宏,做一个中间转换:

定义一个_LINK(AA,BB)的宏做中间转换,就能正常把LINK(A,B)展开_LINK(A,B),最终展开成1234。

好了,本节的内容就分享到这了。

欢迎大家关注我的微信公众号“小白白学电子”,更多学习资源分享:

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值