免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2590 | 回复: 1
打印 上一主题 下一主题

[C] 请问个宏的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-10-19 09:28 |只看该作者 |倒序浏览
我看到一个宏是这样定义的:
#define __EXPORT_SYMBOL(sym, sec)               \
    __CRC_SYMBOL(sym, sec)                  \
    static const char __kstrtab_##sym[]         \
    __attribute__((section("__ksymtab_strings")))       \
    = MODULE_SYMBOL_PREFIX #sym;                        \
    static const struct kernel_symbol __ksymtab_##sym   \
    __attribute_used__                  \
    __attribute__((section("__ksymtab" sec), unused))   \
    = { (unsigned long)&sym, __kstrtab_##sym }

我看到这样的宏,搞糊涂了,如果说是GNU C扩展,应该头尾有两个括号,
这里没用,请问这个宏是什么意思?好像不是也语句?怎么展开?
还有这里的等号(=)是干什么的?

论坛徽章:
0
2 [报告]
发表于 2013-10-19 20:19 |只看该作者
你首先需要理解宏里 # 和 ## 是什么意思。
然后去除__EXPORT_SYMBOL以及__attribute__ 你就容易看懂了。


引用:http://hi.baidu.com/yu_xiyan/item/14981dceb739040b0ad93a87
##(两个井号)和#(一个井号)都是什么意思
宏定义中的井号宏定义中的井号
1)# 只在有参数的定义时用到,为把参数产开并转化成字符串即用""引起来。里面的空格分割全部改为一个,并且会自动添加转义字符'\'
2)##可以用于有无参数都行。它作用就是把##前后连个东西连起来形成新的标示符。
3)#@和#类似,只不过是用''引起来。
考虑下面的宏
#define stringer( x ) printf( #x "\n" )
stringer( In quotes in the printf function call );
stringer( "In quotes when printed to the screen" );   
stringer( "This: \" prints an escaped double quote" );
#define F abc
#define B def
#define FB(arg) #arg
#define FB1(arg) FB(arg)
FB(F B)
FB1(F B)#define paster( n ) printf_s( "token" #n " = %d", token##n )
paster( 9 );#define makechar(x)
a = makechar(b);
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP