2016-07-13 3 views
6

Запуск следующего кодаопределяется (переменная), не оценивается корректно MSVC?

#include <iostream> 

#define FOO 
#define BAR defined(FOO) 

int main() { 
#if BAR 
    std::cout << "BAR enabled!" << std::endl; 
#else 
    std::cout << "BAR disabled!" << std::endl; 
#endif 
    return 0; 
} 

в Visual StudioBar disabled! дисплеях, в то время как работает один и тот же код в gcc или clang дисплеях Bar enabled!.

Это ошибка в компиляторе Microsoft? Что правильно в соответствии со стандартом?

ответ

7

Это не определено поведение в соответствии со стандартом.

[cpp.cond], курсив моего

До оценки, макро вызовов в списке предобработки лексем, которые станут контролирующим константным выражением заменяется (для тех макроимен модифицированных унарного defined исключения), просто как в обычном тексте. Если токен defined генерируется в результате этого процесса замены или использование унарного оператора defined не соответствует одной из двух указанных форм до замены макроса, поведение не определено.

Смежные вопросы