C++ C++;预处理器延迟扩展问题

C++ C++;预处理器延迟扩展问题,c++,visual-studio-2013,c-preprocessor,C++,Visual Studio 2013,C Preprocessor,问题很简单,我只是无法通过第二次宏扩展,它在Visual Studio 2013和2015上报告了一个错误,但在GCC和Clang上运行良好 #include <iostream> #define KS_MACRO_TAIL(A, ...) __VA_ARGS__ #define KS_MACRO_DELAY(M, ...) M(__VA_ARGS__) int main () { int XX = 1; std::cout << KS_MACRO_

问题很简单,我只是无法通过第二次宏扩展,它在Visual Studio 2013和2015上报告了一个错误,但在GCC和Clang上运行良好

#include <iostream>

#define KS_MACRO_TAIL(A, ...)  __VA_ARGS__
#define KS_MACRO_DELAY(M, ...) M(__VA_ARGS__)

int main ()
{
    int XX = 1;
    std::cout << KS_MACRO_TAIL (_, XX) << std::endl;
    std::cout << KS_MACRO_DELAY (KS_MACRO_TAIL, _, XX);
}
#包括
#定义KS_宏_尾(A,…)_瓦_参数__
#定义KS_宏_延迟(M,…)M(uu VA_ARGS_uu)
int main()
{
int XX=1;

std::coutVS2015不擅长按照您想要的方式解析宏。我建议使用变通方法

#define KS_MACRO_DELAY1(M, X) M(X)
#define KS_MACRO_DELAY2(M, X1, X2) M(X1, X2)
#define KS_MACRO_DELAY3(M, X1, X2, X3) M(X1, X2, X3)
#define KS_MACRO_DELAY4(M, X1, X2, X3, X4) M(X1, X2, X3, X4)
// etc.

或者,您应该认真考虑一个根本不涉及使用宏的解决方案。

在调用KS_MACRO_DELAY和KS_MACRO_TAIL之间添加一个额外的宏定义:

#define KS_MACRO_TAIL(A, ...)  __VA_ARGS__
#define KS_MACRO_EVAL(...) __VA_ARGS__
#define KS_MACRO_DELAY(X, ...) KS_MACRO_EVAL(X(__VA_ARGS__))

报告的错误是什么?可以与gcc 5.4.0上的
gcc-E
配合使用(两行都扩展到
XX
)编译器错误将取决于您使用宏的上下文,因此请说明如何使用
KS\u macro\u DELAY
,以及@ScottHunter所说的报告错误的确切内容。确实是一个不错的解决方案。
KS\u macro\u DELAY(KS\u macro\u TAIL,\uxx)
使用此函数工作。嵌套调用仍然无法编译,尽管:
KS\u宏延迟(KS\u宏延迟,KS\u宏延迟,KS\u宏尾,uuu,XX);
为什么?
#define KS_MACRO_TAIL(A, ...)  __VA_ARGS__
#define KS_MACRO_EVAL(...) __VA_ARGS__
#define KS_MACRO_DELAY(X, ...) KS_MACRO_EVAL(X(__VA_ARGS__))