常见下面的一些#define的用法,很有意思啊。(网上看到,整理留存)
#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x
①"x##y"表示什么?
表示x连接y,举例说:
int n = Conn(123,456); //结果就是n=123456;
char* str = Conn("asdf", "adf"); //结果就是 str = "asdfadf";
②"#@x"
其实就是给x加上单引号,结果返回是一个const char。举例说:
char a = ToChar(1); //结果就是a='1';
做个越界试验:
char a = ToChar(123); //结果是a='3';
但是如果你的参数超过四个字符,编译器就给给你报错了!error C2015: too many characters in constant :P
③"#x"
是给x加双引号
char* str = ToString(123132); //结果就是str="123132";
④宏替换的处理机制
请看下面的宏定义
#define f(a,b) a##b
#define d(a) #a
#define s(a) d(a)
此时,宏替换分为两种情况(实质上就是嵌套宏优先级别的控制):
1.不以"#"开头的,先展开其参数宏,然后是再替换代码:
puts(s(f(a,b))); //-->puts(s(ab))-->puts(d(ab))-->puts("ab")
2.以"#"开头的,直接替换,不展开:
puts(d(f(a,b))); //-->puts("f(a,b)")
要善用,但千万别把自己绕晕了!
整理后,又发现网上还有很好的参考资料,请挪步查阅:
2、C++中的宏替换
本文介绍了C/C++中预处理器的有趣用法,包括宏定义中的连接操作符(##)、字符转换(#@)及字符串化(#)。通过实例展示了如何使用这些特性,并讨论了宏替换的处理机制。
382

被折叠的 条评论
为什么被折叠?



