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";
为此我们得理解#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";
相关文章推荐
- 关于宏定义中#与##的用法
- 12-4-26关于普通函数指针,类成员函数指针,char(*)[]
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- 关于宏定义中#和##符号的使用和宏定义展开问题
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- 【C语言】关于宏定义中#和##符号的使用和宏定义展开问题
- 宏定义中#和##的使用
- 关于宏定义中的do-while(0)循环
- 一起学spark(12)-- 关于RDD和DataFrame 的缓存
- 关于jinja2 宏定义的小问题
- 关于GCD的一些宏定义
- source music play list 11-26 (edit 12-6 by clin003 )
- 关于宏定义 # ##
- 宏定义中#和##符号的使用和宏定义展开问题
- 关于12球问题的讨论
- 关于linux0.12临界资源的一点理解和猜测
- TCPL学习笔记:4-12以及4-13。关于使用递归的问题。
- C/C++宏定义中#与##区别