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

问题描述:

问题很简单,我只是无法通过第二次宏扩展,它在Visual Studio 2013和2015上报告错误,但在GCC和Clang上运行良好。C++预处理器延迟扩展问题

#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 << ;是一个语法错误,但上述说法是正确的。

+4

什么所报告的错误? –

+0

可以在gcc 5.4.0上使用'gcc -E'(两行都扩展为'XX'),所以推测VS是特定的。编译器错误将取决于您使用宏的上下文,因此请[编辑您的问题](https://*.com/posts/38975545/edit)来显示如何使用'KS_MACRO_DELAY',正如@ScottHunter所说的那样,正是报告了什么错误。 – cxw

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. 

或者你应该认真思考一个不涉及到使用宏的解决方案。

添加一个额外的宏定义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__)) 
+0

的确很好的解决方案。 'KS_MACRO_DELAY(KS_MACRO_TAIL,_,XX);'用这个。尽管嵌套调用仍然不能编译:'KS_MACRO_DELAY(KS_MACRO_DELAY,KS_MACRO_DELAY,KS_MACRO_TAIL,_,XX);'为什么? – TobiMcNamobi