宏定义中的"#"和"##"符号
2015-12-05 20:16
323 查看
1.宏定义中字符串化操作符
“#”的功能是将其后面的宏参数进行字符串化操作,意思就是对它所应用的宏变量通过替换后在其左右各加上一个双引号。例如
注意能够字符串化操作的必须是宏参数,不是随随便便的某个子串(token)都行的。
2.宏定义中的连接符
连接符##用来将两个token连接为一个token,但它不可以位于第一个token之前or最后一个token之后。注意这里连接的对象只要是token就行,而不一定是宏参数,但是##又必须位于宏定义中才有效,因其为编译期概念(比较绕)。
#:
“#”的功能是将其后面的宏参数进行字符串化操作,意思就是对它所应用的宏变量通过替换后在其左右各加上一个双引号。例如
#define WARN_IF(EXPR) do { if (EXPR) fprintf(stderr, "Warning: " #EXPR "\n"); } while(0) WARN_IF(divider == 0); 将被解析为: do { if (divider == 0) fprintf(stderr, "Warning: " "divider == 0" "\n"); } while(0);
注意能够字符串化操作的必须是宏参数,不是随随便便的某个子串(token)都行的。
2.宏定义中的连接符
##:
连接符##用来将两个token连接为一个token,但它不可以位于第一个token之前or最后一个token之后。注意这里连接的对象只要是token就行,而不一定是宏参数,但是##又必须位于宏定义中才有效,因其为编译期概念(比较绕)。
"#define LINK_MULTIPLE(a, b, c, d) a##_##b##_##c##_##d typedef struct _record_type LINK_MULTIPLE(name, company, position, salary); 上面的代码将被替换为: typedef struct _record_type name_company_position_salary;
#define PARSER(N) printf("token" #N " = %d\n", token##N) 如下调用宏: PARSER(64); 将被解析为: printf("token" "64" " = %d\n", token64);
相关文章推荐
- Openstack在Centos上安装--(二)Mysql和RabbitMQ的安装与配置
- latex输入希腊字母
- leetcode 312 : Burst Balloons
- 【数据结构实验】哈夫曼编/译码
- Android之px、dp、sp之间相互转换
- JUnit简单安装使用步骤总结
- 1005.继续(3n+1)猜想
- IOS 项目协作开发遇到apple push notification 提示开发者权限enrolled需求提示
- 相似性度量总结
- uml类图关系总结
- 【总结】java命令解析以及编译器,虚拟机如何定位类
- centos7中crontab的变更
- URL Session(Cache)
- 笔记十三(绘制二)
- 安装系统出现Winload.exe错误0xc000000e解决方法
- 随机森林算法-Deep Dive
- 在线编程及其学习平台
- /etc/profile、/etc/bashrc、.bash_profile和.bashrc的区别
- Mybatis逆向生成
- JQuery--jQuery对象与DOM对象