12-3-26关于宏定义中的#,##

1,##是一种分隔连接符,先分隔在连接。
为此我们得理解#define 的运作机制。预处理器会一般把空格做为分段的标志,对于每一段与前面的进行比较,相同的就做替换。这样做的结果会导致
替换后字符之间会有多余的空格。因此##就横空出世了。它取代了空格。而且不留痕迹。

另外一些分隔标志是,包括操作符,比如 +, -, *, /, [,], ...,这也可以起到分隔的作用



#define A1(name, type)  type name_##type##_type 

#define A2(name, type)  type name##_##type##_type

A1(a1, int);  /* 等价于: int name_int_type; */

A2(a1, int);  /* 等价于: int a1_int_type;   */

对于第一个例子。预处理器会把其分为type  name_ type _type 这样的四段。然后用前面的进行一一匹配进行替换。这里也可以在##前后加几个空格
最后都会被清除掉的。
2,#则是将字段替换后 用""进行包装起来。

#define  __stringify_1(x)   #x

__stringify_1(linux)   <==>  "linux"


空格处理:

a。忽略传入参数名前面和后面的空格。

如:str=example1(   abc ); 将会被扩展成 str="abc"

b.当传入参数名间存在空格时,编译器将会自动连接各个子字符串,用每个子字符串中只以一个空格连接,忽略其中多于一个的空格。

如:str=exapme( abc    def); 将会被扩展成 str="abc def"


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值