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

时间:2016-08-16 12:54:27

标签: 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_TAIL (_, XX) << std::endl;
    std::cout << KS_MACRO_DELAY (KS_MACRO_TAIL, _, XX);
}

Visual Studio生成以下等效项:

int main ()
{
    int XX = 1;
    std::cout << XX << std::endl;
    std::cout << ;
}

std::cout << ;是语法错误,但上述说法是正确的。

2 个答案:

答案 0 :(得分:2)

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

ret

答案 1 :(得分:0)

VS2015不擅长以您希望的方式解析您的宏。我建议使用解决方法

#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.

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