c/c++ 宏定义中的#/##

X264代码中的一段出现了# 和 ##

#define str(s) #s
#define xstr(s) str(s)

供参考查阅的链接如下:

http://www.cnblogs.com/mydomain/archive/2010/09/25/1834917.html

http://blog.sina.com.cn/s/blog_ad0672d60101eiib.html

http://www.cnblogs.com/wangzijing/archive/2013/02/28/2937774.html

1.  在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组。

2. 如果##后的参数本身也是一个宏的话,##会阻止这个宏的展开,也就是只替换一次。

3. 对空格的处理

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

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

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

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



你可能感兴趣的:(C++,c,宏,#)