宏定义中##和#的作用

宏定义中##和#的作用

ID:39135159

大小:32.51 KB

页数:3页

时间:2019-06-25

宏定义中##和#的作用_第1页
宏定义中##和#的作用_第2页
宏定义中##和#的作用_第3页
资源描述:

《宏定义中##和#的作用》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、内核中有很多的宏定义,在宏定义define中经常看到两个字符串##和#,这里把它的用法做一下说明:##是一个连接符号,用于把参数连在一起例如:>#defineFOO(arg)my##arg则>FOO(abc)相当于myabc#是“字符串化”的意思。出现在宏定义中的#是把跟在后面的参数转换成一个字符串例如:>#defineSTRCPY(dst,src)strcpy(dst,#src)则>STRCPY(buff,abc)相当于strcpy(buff,"abc")另外,如果##后的参数本身也是一个宏的话,##会阻止这个宏的展开。#defineSTRCPY(a,b)strcpy(a##_p

2、,#b)intmain(){charvar1_p[20];charvar2_p[30];strcpy(var1_p,"aaaa");strcpy(var2_p,"bbbb");STRCPY(var1,var2);STRCPY(var2,var1);printf("var1=%s",var1_p);printf("var2=%s",var2_p);return0;/*注意这里*/STRCPY(STRCPY(var1,var2),var2);/*这里是否会展开为:strcpy(strcpy(var1_p,"var2")_p,"var2“)?*答案是否定的:*展开结果将是:str

3、cpy(STRCPY(var1,var2)_p,"var2")*##阻止了参数的宏展开!*如果宏定义里没有用到#和##,宏将会完全展开*/}/////////////////////////////////////////////////////////////////////////tellyouabout##incommontext关于记号粘贴操作符(tokenpasteoperator):##1.简单的说,“##”是一种分隔连接方式,它的作用是先分隔,然后进行强制连接。其中,分隔的作用类似于空格。我们知道在普通的宏定义中,预处理器一般把空格解释成分段标志,对于每一段和前面比较

4、,相同的就被替换。但是这样做的结果是,被替换段之间存在一些空格。如果我们不希望出现这些空格,就可以通过添加一些##来替代空格。另外一些分隔标志是,包括操作符,比如+,-,*,/,[,],...,所以尽管下面的宏定义没有空格,但是依然表达有意义的定义:defineadd(a,b)a+b而其强制连接的作用是,去掉和前面的字符串之间的空格,而把两者连接起来。2.举列--试比较下述几个宏定义的区别#defineA1(name,type)typename_##type##_type或#defineA2(name,type)typename##_##type##_typeA1(a1,int);

5、/*等价于:intname_int_type;*/A2(a1,int);/*等价于:inta1_int_type;*/解释:1)在第一个宏定义中,"name"和第一个"_"之间,以及第2个"_"和第二个"type"之间没有被分隔,所以预处理器会把name_##type##_type解释成3段:“name_”、“type”、以及“_type”,这中间只有“type”是在宏前面出现过的,所以它可以被宏替换。2)而在第二个宏定义中,“name”和第一个“_”之间也被分隔了,所以预处理器会把name##_##type##_type解释成4段:“name”、“_”、“type”以及“_typ

6、e”,这其间,就有两个可以被宏替换了。3)A1和A2的定义也可以如下:#defineA1(name,type)typename_##type##_type<##前面随意加上一些空格>#defineA2(name,type)typename##_##type##_type结果是##会把前面的空格去掉完成强连接,得到和上面结果相同的宏定义3.其他相关--单独的一个#至于单独一个#,则表示对这个变量替换后,再加双引号引起来。比如#define__stringify_1(x)#x那么__stringify_1(linux)<==>"linux"所以,对于MODULE_DEVICE_TABL

7、E1)#defineMODULE_DEVICE_TABLE(type,name)MODULE_GENERIC_TABLE(type##_device,name)2)#defineMODULE_GENERIC_TABLE(gtype,name)externconststructgtype##_id__mod_##gtype##_table__attribute__((unused,alias(__stringify(name))))得到MODULE_DEVICE_TAB

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。