gpt4 book ai didi

C++ 匿名变量

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:52 24 4
gpt4 key购买 nike

为什么这行不通?

 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 下运行。

最佳答案

您需要添加一个间接级别,以便扩展 __LINE__:

#define _CONCAT_(x,y) x ## y
#define CONCAT(x,y) _CONCAT_(x,y)

#define VAR_LINE(x) int CONCAT(_anonymous, __LINE__) = x

关于C++ 匿名变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/461062/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com