c语⾔中u%的⽤法,C语⾔中“#”和##的⽤法
1. 前⾔
使⽤#把宏参数变为⼀个字符串,⽤##把两个宏参数贴合在⼀起.
2. ⼀般⽤法#include#includeusing namespace std;#define STR(s) #s#define CONS(a,b) int(a##e##b)int main(){
printf(STR(vck)); // 输出字符串"vck" printf("%d\n", CONS(2,3)); // 2e3 输出:2000 return 0;}
3. 注意事项当宏参数是另⼀个宏的时候,需要注意的是凡宏定义⾥有⽤’#’或’##’的地⽅宏参数是不会再展开.
即, 只有当前宏⽣效, 参数⾥的宏!不!会!⽣!效
3.1 举例#define A (2)#define STR(s) #s#define CONS(a,b) int(a##e##b)printf("int max: %s\n", STR(INT_MAX)); // INT_MAX #includeprintf("%s\n", CONS(A, A)); // compile error --- int(AeA)
两句print会被展开为:printf("int max: %s\n","INT_MAX");printf("%s\n", int(AeA));
分析:
c语言return的用法和搭配由于A和INT_MAX均是宏,且作为宏CONS和STR的参数,并且宏CONS和STR中均含有#或者##符号,所以A和INT_MAX均不能被解引⽤。导致不符合预期的情况出现。
3.2 解决⽅案解决这个问题的⽅法很简单. 加多⼀层中间转换宏. 加这层宏的⽤意是把所有宏的参数在这层⾥全部展开,
那么在转换宏⾥的那⼀个宏(_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) // 转换宏
结果:printf("int max: %s\n",STR(INT_MAX));//输出为: int max:0x7fffffff//STR(INT_MAX) --> _STR(0x7fffffff) 然后再转换成字符串; printf("%d\n", CONS(A, A));//输出为:200//CONS(A, A) --> _CONS((2), (2)) --> int((2)e(2))
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论