C++宏定义中"#"与"##"的妙用
2024-08-28 08:38:39
在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)")
最新文章
- addUser
- hdu 4027 2011上海赛区网络赛G 线段树 成段平方根 ***
- POJ #2479 - Maximum sum
- 关于Eclipse平台的使用和开发第一个SWT程序
- luoguP2265 路边的水沟
- easyui之datagrid(不定时补充)
- ie6兼容性
- poj1862---变形虫(贪心)
- r语言之给定的概率密度函数生成随机数
- HDU 5045 Contest
- IGeoFeatureLayer
- ubuntux下apk反编译工具安装
- 用JavaScript实现表格编辑器
- linux下如何配置yum源
- 一小时学会ECMAScript6新特性(二)
- Tensorflow卷积神经网络[转]
- gitlab的完全卸载
- javaweb项目静态资源被拦截的解决方法
- 如何获取启动页activity
- 利用Html.css OPPO手机导航菜单的制作解析