在C++开发当中经常用到宏的定义当中使用"#"或者"##",以下是对着两种符号使用方法的简单描述:

define中的#就是把#后面的参数当做一个符号来使用,简单的说就是把它当做字符串连接起来,##连接前后2个符号, define定义中以#开头的宏直接替换不展开,以非#开头的宏先展开再替换。

如下:

#define f(a,b) a##b

#define d(a) #a

#define s(a) d(a)

puts(d(f(a,b))); 输出结果: f(a,b)

puts(s(f(a,b))); 输出结果: ab

展开的过程如下:

puts(d(f(a,b))); ----> 因为d宏的定义以#开头,宏中的参数是另外一个宏,且带##,所以作为参数的宏不展开,相当于puts(#f(a,b));----->puts("f(a,b)");

puts(s(f(a,b))); ----> 因为s宏的定义不以#开头,宏中的参数是另外一个宏,但不带##,所以作为参数的宏先展开,相当于

puts(s(ab));----->puts(d(ab));---->puts(#ab);---->puts("ab");

综上所述有以下2中情况: 1.不以"#"开头的,先展开参数a,然后是替换代码:

puts(s(f(a,b)));-->puts(s(ab))-->puts(d(ab))-->puts("ab")

2.以"#"开头的,直接替换,不展开:

puts(d(f(a,b)))-->puts("f(a,b)")

最新文章

  1. addUser
  2. hdu 4027 2011上海赛区网络赛G 线段树 成段平方根 ***
  3. POJ #2479 - Maximum sum
  4. 关于Eclipse平台的使用和开发第一个SWT程序
  5. luoguP2265 路边的水沟
  6. easyui之datagrid(不定时补充)
  7. ie6兼容性
  8. poj1862---变形虫(贪心)
  9. r语言之给定的概率密度函数生成随机数
  10. HDU 5045 Contest
  11. IGeoFeatureLayer
  12. ubuntux下apk反编译工具安装
  13. 用JavaScript实现表格编辑器
  14. linux下如何配置yum源
  15. 一小时学会ECMAScript6新特性(二)
  16. Tensorflow卷积神经网络[转]
  17. gitlab的完全卸载
  18. javaweb项目静态资源被拦截的解决方法
  19. 如何获取启动页activity
  20. 利用Html.css OPPO手机导航菜单的制作解析

热门文章

  1. matlab可变参数
  2. spring集成环境下的axis webservice的发布,调试
  3. bzoj 1997: [Hnoi2010]Planar
  4. elasticsearch插件之一:bigdesk
  5. 二模 (7) day1
  6. JSP初识
  7. 跨域SSO的实现
  8. Java注解配置
  9. 后台框架--HUI 的学习跟使用1
  10. sql 语句中使用条件判断case then else end