2016-07-13 12 views
6

Ausführen den folgenden Codedefiniert (VARIABLE) nicht korrekt von MSVC ausgewertet?

#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; 
} 

in Visual Studio Displays Bar disabled!, während den gleichen Code in gcc oder clang Displays Bar enabled! läuft.

Ist das ein Fehler im Microsoft Compiler? Was ist nach dem Standard richtig?

Antwort

7

Dies ist ein undefiniertes Verhalten gemäß dem Standard.

[cpp.cond], Hervorhebung von mir

Vor der Auswertung, Makro Anrufungen in der Liste der Vorverarbeitung Token, das die Steuerung konstanten Ausdruck (mit Ausnahme der Makronamen durch den defined unärer Operator modifizierten) ersetzt werden wird, nur wie im normalen Text. Wenn das Token defined als Ergebnis dieses Ersetzungsprozesses generiert wird oder wenn der unäre Operator defined nicht mit einem der beiden angegebenen Formulare vor dem Makroersatz übereinstimmt, ist das Verhalten nicht definiert.