2016-07-13 14 views
6

Running następujący kodzdefiniowany (VARIABLE) nie został poprawnie oceniony przez 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; 
} 

w Visual Studio wyświetlaczy Bar disabled!, podczas uruchamiania tego samego kodu w gcc lub clang wyświetlaczy Bar enabled!.

Czy to błąd w kompilatorze firmy Microsoft? Co jest poprawne zgodnie ze standardem?

Odpowiedz

7

Jest to niezdefiniowane zachowanie zgodne ze standardem.

[cpp.cond], podkr

Przed oceną, makro inwokacje na liście tokenów preprocesora, które staną się kontroli stałą ekspresję zastępuje (z wyjątkiem tych makr nazwami zmodyfikowanych przez operatora jednoargumentowego defined), po prostu jak w zwykłym tekście. Jeśli znacznik defined powstaje w wyniku tego procesu wymiany lub stosowania przez operatora jednoargumentowy defined nie pokrywała się z jedną z dwóch postaci podanych przed makro wymianie, zachowanie jest zdefiniowana.

Powiązane problemy