определено (переменная) не правильно оценивается 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 Studio выводит Bar disabled!, при выполнении того же кода в gcc или лязгом выводит Bar enabled!.

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

1 ответов


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

[cpp.cond], выделено мной

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