#i nclude using namespace std; #def">  #i nclude using namespace std; #def" />
宏中#和##的用法

宏中#和##的用法

ID:38059836

大小:14.49 KB

页数:3页

时间:2019-05-25

宏中#和##的用法_第1页
宏中#和##的用法_第2页
宏中#和##的用法_第3页
资源描述:

《宏中#和##的用法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、宏中"#"和"##"的用法 一、一般用法 我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起. 用法: #i nclude #i nclude using namespace std; #define STR(s)     #s #define CONS(a,b)  int(a##e##b) int main() {     printf(STR(vck));           // 输出字符串"vck"     printf("%d", CONS(2,3));  // 2e3 输出:2

2、000     return 0; } 二、当宏参数是另一个宏的时候 需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开. 1, 非'#'和'##'的情况 #define TOW      (2) #define MUL(a,b) (a*b) printf("%d*%d=%d", TOW, TOW, MUL(TOW,TOW)); 这行的宏会被展开为: printf("%d*%d=%d", (2), (2), ((2)*(2))); MUL里的参数TOW会被展开为(2). 2, 当有'#'或'##'的时候 #defi

3、ne A          (2) #define STR(s)     #s #define CONS(a,b)  int(a##e##b) printf("int max: %s",  STR(INT_MAX));    // INT_MAX #i nclude 这行会被展开为: printf("int max: %s", "INT_MAX"); printf("%s", CONS(A, A));               // compile error  这一行则是: printf("%s", 

4、int(AeA)); INT_MAX和A都不会再被展开, 然而解决这个问题的方法很简单. 加多一层中间转换宏. 加这层宏的用意是把所有宏的参数在这层里全部展开, 那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数. #define A           (2) #define _STR(s)     #s #define STR(s)      _STR(s)          // 转换宏 #define _CONS(a,b)  int(a##e##b) #define CONS(a,b)   _CONS(a,b)       

5、// 转换宏 printf("int max: %s", STR(INT_MAX));          // INT_MAX,int型的最大值,为一个变量 #i nclude 输出为: int max: 0x7fffffff STR(INT_MAX) -->  _STR(0x7fffffff) 然后再转换成字符串; printf("%d", CONS(A, A)); 输出为:200 CONS(A, A)  -->  _CONS((2), (2))  --> int((2)e(2)) 三、'#'和'##'的一些应

6、用特例 1、合并匿名变量名 #define  ___ANONYMOUS1(type, var, line)  type  var##line #define  __ANONYMOUS0(type, line)  ___ANONYMOUS1(type, _anonymous, line) #define  ANONYMOUS(type)  __ANONYMOUS0(type, __LINE__) 例:ANONYMOUS(static int);  即: static int _anonymous70;  70表示该行行号; 第一层:ANON

7、YMOUS(static int);  -->  __ANONYMOUS0(static int, __LINE__); 第二层:                        -->  ___ANONYMOUS1(static int, _anonymous, 70); 第三层:                        -->  static int  _anonymous70; 即每次只能解开当前层的宏,所以__LINE__在第二层才能被解开; 2、填充结构 #define  FILL(a)   {a, #a} enum IDD

8、{OPEN, CLOSE}; typedef struct MSG{   IDD id;   const char * msg; }MSG; MSG _msg[] = {FILL(OPEN),

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。