2016-12-28 70 views
0

Microsoft Visual Studio Professional 2015版本14.0.25431.01更新3在編譯code below時發出錯誤。對我來說看起來像一個bug。VC Bug?編譯器無法計數__VA_ARGS__'參數


謝謝。

#include <iostream> 

#define A(a, b, c, ...) #__VA_ARGS__ 
#define B(...) A(__VA_ARGS__) 

int main() 
{ 
    // warning C4003: not enough actual parameters for macro 'A' 
    // error C2059: syntax error: ';' 
    std::cout << B(1, 2, 3, 4); // should print '4'          
    return 0; 
} 
+1

[MSVC不能正確展開'__VA_ARGS__'](http://stackoverflow.com/questions/5134523/msvc-doesnt-expand-va-args-correctly) – cpplearner

+0

@cpplearner謝謝。 – ZDF

回答

1

它看起來像一個bug。這是可能的解決它與宏的另一層:

#define EXPAND(...) __VA_ARGS__ 
#define A(a, b, c, ...) #__VA_ARGS__ 
#define B(...) EXPAND(EXPAND(A) (__VA_ARGS__)) 

的想法是,第一,EXPAND(A)被擴大到A(__VA_ARGS__)被擴大到(1, 2, 3, 4)。然後,你只剩下A (1, 2, 3, 4),如果你強迫它再次擴展,VC++會理解。

+0

我想'#define EXPAND(a)a'&'#define B(...)EXPAND(A(__ VA_ARGS __))'更簡單。 – ZDF

+0

@ZDF如果你想傳遞任何包含逗號的東西,你需要''''和'__VA_ARGS__'作爲'EXPAND'。至於'EXPAND(A(__ VA_ARGS __))',它應該先嚐試擴展A(__ VA_ARGS __)',然後再次展開結果。如果這足以壓制警告,我認爲你已經發現了另一個bug,如果*那個* bug在原始版本之前設法修復,那麼代碼將再次破壞。 – hvd

+0

我想我沒找到東西。根據微軟的說法,這種行爲是正確的。請參閱cpplearner提供的[link](http://stackoverflow.com/questions/5134523/msvc-doesnt-expand-va-args-correctly)。 – ZDF