C语言中单井号(#)和双井号(##)在宏语句中的应用-创新互联

在阅读Linux内核代码过程中,特别是一些预处理指令宏的时候,会看到宏语句里会包含一些# 或者是连着的## 符号,刚接触的时候觉得很一头雾水,但这些宏语句有时候绕不开,所以为了更好地读懂这些代码,很有必要仔细学些一下这些特殊符号的含义。

创新互联致力于互联网品牌建设与网络营销,包括网站设计制作、成都网站建设、SEO优化、网络推广、整站优化营销策划推广、电子商务、移动互联网营销等。创新互联为不同类型的客户提供良好的互联网应用定制及解决方案,创新互联核心团队10余年专注互联网开发,积累了丰富的网站经验,为广大企业客户提供一站式企业网站建设服务,在网站建设行业内树立了良好口碑。

# 的功能

# 的功能是将其后面的宏参数进行字符串化操作(stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。

1. #define WARN_IF(exp) \

2. do { \

3. if (exp) \

4. fprintf(stderr, "Warning: " #exp "\n"); \

5. } while(0)

现在在程序中以下面的方式调用这个宏:

1. WARN_IF (divider == 0);

那么在编译时,上面的这句话被扩展为:

1. do { if (divider == 0) fprintf(stderr, "Warning: " "divider == 0" "\n"); } while(0);

这样每次divider(除数)为0的时候便会在标准错误流上输出一个提示信息。

## 的功能

## 称为连接符号(concatenator),由两个# 号组成,其功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。但它不可以是第一个或者后一个子串。所谓的子串(token)就是指编译器能够识别的小语法单元,注意这里连接的对象是token就行,而不一定是宏的变量。

下面举个例子来看看它们是怎样工作的。假设程序中已经定义了这样一个带参数的宏:

1. #define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##d

现在在程序中以下面的方式调用这个宏:

1. struct _record_type LINK_MULTIPLE(name,company,position,salary);

那么在编译时,上面的这句话被扩展为:

1. struct _record_type name_company_position_salary;

综合举例

后举一个综合# 和## 的例子。假设程序中已经定义了这样一个带参数的宏:

1. #define paster( n ) printf( "token" #n " = %d", token##n )

现在在程序中以下面的方式调用这个宏:

1. int token9 = 9;

2. paster( 9 );

那么在编译时,上面的paster( 9 ); 这句话被扩展为:

1. printf( "token" "9" " = %d", token9 );

注意到在这个例子中, paster(9); 中的这个9 被原封不动的当成了一个字符串,与”token”连接在了一起,从而成为了token9 。而#n 也被”9”所替代。 可想而知,上面程序运行的结果就是在屏幕上打印出

1. token9=9

相信大家理解了这些特殊符号在宏语句中的含义后,对阅读内核的代码会带来帮助。

嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!

无偿分享大家一个资料包,

差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。(点击找小助理领取)

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文标题:C语言中单井号(#)和双井号(##)在宏语句中的应用-创新互联
文章路径:http://ybzwz.com/article/djesoh.html