C/C++中“#”和“##”的作用和用法
来源:互联网 发布:mysql 5.x数据库中文版 编辑:程序博客网 时间:2024/06/11 15:57
FROM:http://www.2cto.com/kf/201503/381187.html
在C/C++的宏中,”#”的功能是将其后面的宏参数进行字符串化操作(Stringfication),简单说就是在对它所引用的宏变量通过替换后在其左右各加上一个双引号。
而”##”被称为连接符(concatenator),用来将两个子串Token连接为一个Token。注意这里连接的对象是Token就行,而不一定是宏的变量。还可以n个##符号连接n+1个Token,这个特性是#符号所不具备的。
凡是宏定义里有用’#’或’##’的地方宏参数是不会再展开。
若要使’#’和’##’的宏参数被展开,可以加多一层中间转换宏。加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换宏里的那一个宏就能得到正确的宏参数。
以下是测试代码:
#include stdafx.h#include using namespace std;//test1#define WARN_IF(EXP) if (EXP) fprintf(stderr, warning: #EXP );//test2#define STR(s) #s//test3#define _STRI(s) #s#define STRI(s) _STRI(s) //转换宏//test4#define paster(n) printf(token#n = %d, token##n)//test5#define _CONS(a, b) int(a##+##b)#define CONS(a, b) _CONS(a, b) //转换宏//test6#define _GET_FILE_NAME(f) #f#define GET_FILE_NAME(f) _GET_FILE_NAME(f) //转换宏//test7#define _TYPE_BUF_SIZE(type) sizeof #type#define TYPE_BUF_SIZE(type) _TYPE_BUF_SIZE(type) //test8#define D(x) #@x //仅对单一标记转换有效int main(int argc, char* argv[]){//test1int divider = 0;WARN_IF(divider == 0);//warning: divider == 0 //test2printf(int max: %s, STR(INT_MAX));//int max: INT_MAX//test3printf(int max: %s, STRI(INT_MAX));//int max: 2147483647//test4int token9 = 9;paster(9);//token9 = 9 //test5int A = 15, B = 2;printf(A + B = %d, CONS(A, B));//A + B = 17//test6char FILE_NAME[] = GET_FILE_NAME(__FILE__);cout<
0 0
- c中(),[],{}的作用和用法
- C/C++中“#”和“##”的作用和用法
- C/C++中“#”和“##”的作用和用法
- C/C++中“#”和“##”的作用和用法
- C/C++中“#”和“##”的作用和用法
- 谈谈Objective-C中@class的作用和用法
- C/C++ 中const 的具体作用和用法
- c中的union的用法和作用
- c中的union的用法和作用
- 【c/c++】auto_ptr作用和用法
- [c、c++]宏中"#"和"##"的用法
- [c、c++]宏中"#"和"##"的用法
- C语言宏中#和##的作用
- C和C++中static的作用
- C语言中 ##和#的作用
- C和C++中const的作用?
- C/C+++的中变量作用域和存储类型
- 【C++】setw函数的用法和作用【原创技术】
- Android之Xutils
- ubuntu忘记密码
- 第一篇博客
- 紫书 习题 9-8 uva1632
- 安卓:回退栈,类似新闻的布局界面
- C/C++中“#”和“##”的作用和用法
- Fragment 与 Activity交互
- 三种获取LayoutInflater对象的方式
- 白驹过隙之大一总结第二话
- 第九课 3D空间中移动图像:
- BZOJ 1123 [POI2008]BLO 点双连通分量
- 项目实战No8 刷新 日历处理
- BH_AdManager_问题解决汇集_20150915
- 有哪些SQL语句会导致CPU过高?