您的位置:首页 > 其它

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

2012-03-26 14:09 288 查看
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";
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: