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

# 的功能

# 的功能是将其后面的宏参数进行字符串化操作(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

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

mysql的双井号_C语言中单井号(#)和双井号(##)在宏语句中的应用相关推荐

  1. delphi去掉字段前后的引号_Delphi编程SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法...

    Delphi编程SQL语句中引号(').quotedstr().('').format()在SQL语句中的用法 (2011-06-23 12:14:13) 标签: delphi编程 sql语句引号 q ...

  2. 总结一下SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法

    总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中的用法以 及SQL语句中日期格式的表示(#).('') 在Delphi中进行字符变量连接相加时单引号用( ...

  3. (转载)总结一下SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法...

    总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中的用法 总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中 ...

  4. SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法

    总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中的用法总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中的 ...

  5. 总结一下SQL语句中引号()、quotedstr()、()、format()在SQL语句中的用法

    View Code 总结一下SQL语句中引号('').quotedstr().('''').format()在SQL语句中的用法以及SQL语句中日期格式的表示(#).('''')在Delphi中进行字 ...

  6. (转载)总结一下SQL语句中引号(')、quotedstr()、('')、format()在SQL语句中的用法

    总结一下SQL语句中引号(').quotedstr().('').format()在SQL语句中的用法以 及SQL语句中日期格式的表示(#).('') 在Delphi中进行字符变量连接相加时单引号用( ...

  7. SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete)

    SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete) SQL Server 2008提供了一个增强的SQL命令Merge,用法参看MS ...

  8. matlab pi表示,在matlab绘图中,x=0:0.1:4*pi;此语句中,0,0.1,4*... MATLAB中,x=0:pi/100:2*pi;表示什么意思?...

    导航:网站首页 > 在matlab绘图中,x=0:0.1:4*pi;此语句中,0,0.1,4*... MATLAB中,x=0:pi/100:2*pi;表示什么意思? 在matlab绘图中,x=0 ...

  9. .net 宏定义_C语言基础知识:几种特殊的函数宏封装方式

    函数宏介绍 函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销. 函数宏本质上为宏,可以直接进行定义,例如: #define INT ...

最新文章

  1. linux服务器不会中毒,[转载]ubuntu 不会中毒的原因(转)
  2. 前端学习(2750):global全局外观设置
  3. boost库学习入门篇
  4. C语言第七次作业---要死了----
  5. 程序员又迎一利器,联想 LeapIOT 工业互联网平台大曝光
  6. osea/ introduction
  7. 计算机税率函数,excel怎么设置税率 | 如何用EXCEL函数,做一个税金计算表格
  8. Mac电脑开启共享wifi教程
  9. 微信 客服消息 发送 微信会回调三次的问题
  10. 破解 WIDCOMM 蓝牙驱动的方法
  11. Python制作连连看脚本工具,全程自动,不需要你动,简直太爽了
  12. hdu 4379The More The Better
  13. 肖秀荣教授:就考研政治来说
  14. 搜遍全网,终于找到一个适合新手入门的物联网教程
  15. 生产排程系统_高级计划排产系统APS,已成为提高企业生产效率的核心利器!
  16. 好用又免费的办公软件
  17. copy和xcopy有何区别
  18. XPLANE,世界级的“Visual Thinking”Company
  19. JS设置CSS样式的几种方式
  20. YJango的卷积神经网络——介绍

热门文章

  1. 如何从程序员升级到架构师?
  2. linux代码之spin lock
  3. C#chart绘折线图动态添加数据
  4. 商务软件开发网课答案
  5. IOT-Studio 物联网应用开发实例
  6. [转载] 刘迪: Stata空间溢出效应的动态图形 (空间计量)
  7. CAFFE源码学习之优化方法solver
  8. 专升本-计算机公共课考点(4)—— 电子表格处理软件 Excel 2010
  9. JeecgBoot腾讯云部署发布小结
  10. rust react tauri app 现有前端项目打包(windows)