奇怪的C++预处理器宏语法

1 c++ concatenation c-preprocessor

我把我的问题提炼到这个代码片段 - 但它是一个更大的程序的一部分,所以我不想要一个不同的方式来做到这一点 - 我需要一种方法来使这项工作!

当我从这段代码生成预处理文件时:

#define OUTER(a, b) \
    a##b
#define INNER(c, d) \
    c##d

enum foo {
    OUTER(INNER(x, y), z)
}; // line 108

int APIENTRY _tWinMain(...)
{
    foo bar = xyz; // line 112
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

enum foo {
    xyz
}; // line 108

int __stdcall wWinMain(...)
{
    foo bar = xyz; // line 112
}
Run Code Online (Sandbox Code Playgroud)

这就是我想要的.但是,如果我尝试编译代码,我得到:

错误C2146:语法错误:在标识符'z'之前缺少'}'第108行
错误C2143:语法错误:缺少';' 在'}'第108行之前
错误C2143:语法错误:缺少';' 在'}'第108行之前
错误C2059:语法错误:'}'第108行
错误C2065:'xyz':未声明的标识符行112

我无法解决这个问题!问题似乎是由于##:

#define OUTER(a, b) \
    a##b
Run Code Online (Sandbox Code Playgroud)

但是为什么(以及如何解决它)超出了我......

Nor*_*ame 9

请改用:

#define CONCAT(X,Y) X##Y
#define OUTER(a, b) CONCAT(a,b)
#define INNER(a, b) CONCAT(a,b)

enum foo {
    OUTER(INNER(x, y),z)
}; // line 108

int main(...)
{
    foo bar = xyz; // line 112
}
Run Code Online (Sandbox Code Playgroud)