资源描述:
《宏定义中#,#@,##的用法》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、宏定义中"#"的用法分类: VC/MFC2011-01-0911:32 49人阅读 评论(0) 收藏 举报惭愧,今天测试了才真正明白,在宏定义中使用"#", 还是因为群里有TX提出,才测试的 看代码: viewplain1.#define macro(a) #a 2.#define macro2(a,b) a##b 3.#define macro3(a,b,c) a##b##c #a, 表示a不再是一个变量,而变成了字符串"a"##表示连接,a##b, 表示输入的参数名为ab, a##b
2、##c同理,代表变量名为:abc 测试例子:viewplain1.int x = 3; 2.int y = 4; 3.int xy = 10; 4.int xyz=20; 5.CString str; 6. 7. 8.OutputDebugString(macro(x)); 9. 10.str.Format("%d",macro2(x,y)); 11.OutputDebugString(str); 12. 13.str.Format("%d",macro3(
3、x,y,z)); 1.OutputDebugString(str); 输出结果为:x1020 第一个为x, marco(x), x变成了"x"字符串第二个为10,macro(x,y),就是变量xy第三个为20,macro(x,y,z),就是变量xyzC语言宏定义中"#","#@"和"##"的用法一、一般用法#把宏参数变为一个字符串,#@把宏参数变为一个字符,##把两个宏参数贴合在一起。 #include#include#defineSTR(s)
4、#s //#与参数之间可以有空格#defineTOCHAR(c) #@c #defineCONS(a,b) int(a##e##b) //##与参数之间可以有空格intmain(void){ printf(STR(pele)); //输出字符串"pele" printf("%c",TOCHAR(z)); //输出字符z printf("%d",CONS(2,3)); //2e3输出:2000 return0;} 二、当宏参
5、数是另一个宏的时候需要注意的是凡宏定义里有用'#'或'##'的地方宏参数是不会再展开的。#defineA (2)#defineSTR(s) #s#defineCONS(a,b) int(a##e##b) printf("intmax:%s", STR(INT_MAX));这行会被展开为:printf("intmax:%s","INT_MAX"); printf("%s",CONS(A,A)); 这一行被展开为:printf("%s",int(AeA)); I
6、NT_MAX和A都不会再被展开,然而解决这个问题的方法很简单,多加一层中间转换宏。加这层宏的用意是把所有宏的参数在这层里全部展开,那么在转换宏里的那一个宏(_STR)就能得到正确的宏参数。 #defineA (2)#define_STR(s) #s#defineSTR(s) _STR(s) //转换宏#define_CONS(a,b) int(a##e##b)#defineCONS(a,b) _CONS(a,b) //转换宏 printf("
7、intmax:%s",STR(INT_MAX));输出为:intmax:0x7fffffffSTR(INT_MAX) --> _STR(0x7fffffff) -->"0x7fffffff" printf("%d",CONS(A,A));输出为:200CONS(A,A) --> _CONS((2),(2)) -->int((2)e(2)) 以下为Minix3操作系统相关的源代码:#ifdef _ANSI#define __str(x) #x#define __xstr(x)
8、 __str(x) //转换宏_PROTOTYPE(void__bad_assertion,(constchar*_mess));#define assert(expr)((expr)?(void)0: __bad_assertion("Assertion""#expr ""failed,file"__xstr(__FILE__) ",line"__xstr(__LINE_