2016-12-28 6 views
0

Microsoft Visual Studio Professional 2015 Версия 14.0.25431.01 Обновление 3 вызывает ошибки при компиляции code below. Похож на меня.Ошибка VC? Компилятор Невозможно считать __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

Это похоже на ошибку. Можно работать вокруг него с другим слоем макросов:

#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 __)', а затем снова развернуть результат. Если этого достаточно, чтобы подавить предупреждение, я думаю, что вы обнаружили еще одну ошибку, и если *, что * ошибка будет исправлена ​​до того, как оригинал сделает, код снова сломается. – hvd

+0

Думаю, я ничего не нашел. :) По словам Microsoft, поведение является правильным. См. [Link] (http://stackoverflow.com/questions/5134523/msvc-doesnt-expand-va-args-correctly), предоставленный cpplearner. – ZDF