2016-12-28 29 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