2016-08-16 80 views
1

問題很簡單,我只是無法通過第二次宏擴展,它在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://stackoverflow.com/posts/38975545/edit)來顯示如何使用'KS_MACRO_DELAY',正如@ScottHunter所說的那樣,正是報告了什麼錯誤。 – cxw

回答

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. 

或者你應該認真思考一個不涉及到使用宏的解決方案。

2

添加一個額外的宏定義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