为什么这不起作用?
0. #define CONCAT(x, y) x ## y
1.
2. #define VAR_LINE(x) \
3. int CONCAT(_anonymous, __LINE__) = x
4.
5. #define VAR_LINE2(x) \
6. int _anonymous ## x = 1
7.
8. int main()
9. {
10. VAR_LINE(1);
11. VAR_LINE(1);
12. VAR_LINE(1);
13. VAR_LINE2(__LINE__);
14. }
上述宏扩展的结果
int _anonymous__LINE__ = 1;
int _anonymous__LINE__ = 1;
int _anonymous__LINE__ = 1;
int _anonymous13 = 1;
如果我不必将__LINE__
宏写为参数,那将会很方便。
我认为问题非常清楚。我希望能够生成匿名变量,以便在同一范围内声明多个变量时,此宏不会因重定义错误而失败。我的想法是使用预定义的__LINE__
宏,因为不会像这样在同一行上声明变量。但宏观扩张困扰着我,你能帮忙吗?
感谢Luc Touraille。但是,建议的解决方案存在一个小问题。操作数和##运算符之间必须有空格(显然标准说不然,但如果运算符和操作数之间没有空格,则PS3风格的GCC不会正确扩展宏)。
#define _CONCAT(x,y) x ## y
#define CONCAT(x,y) _CONCAT(x,y)
VAR_LINE宏现在产生:
int _anonymous10 = 1;
int _anonymous11 = 1;
int _anonymous12 = 1;
这已经过验证可以在Win32(Visual Studio 2008),XBOX360(Xenon)和PS3下使用。
答案 0 :(得分:11)
您需要添加一个间接级别,以便扩展__LINE__
:
#define _CONCAT_(x,y) x ## y
#define CONCAT(x,y) _CONCAT_(x,y)
#define VAR_LINE(x) int CONCAT(_anonymous, __LINE__) = x