C ++匿名变量

时间:2009-01-20 12:13:53

标签: c++ c-preprocessor

为什么这不起作用?

 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下使用。

1 个答案:

答案 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