2017-04-26 3 views
2

Ich versuche, ein Multiplattform-C++ - Projekt mit dem Microsoft Visual C++ - Compiler zu kompilieren (früher wurde der GCC neben anderen Compilern verwendet).Ist es sicher, _MSVC_LANG anstelle von __cplusplus zu verwenden?

Nun komme ich auf einige Präprozessordirektiven wie diese:

#if __cplusplus < 201103L 
    // Define some macros of C++11 the code really relies on. 
    // [...] 
#endif 

Obwohl ich Visual Studio 2015 verwenden, wird __cplusplus noch als 199711L definiert. This post from the Microsoft blog rät, auch für _MSVC_LANG zu überprüfen.

Inwieweit entspricht _MSVC_LANG >= 201402L nicht C++ 11?

+3

Check * auch * nicht * statt * (logische oder). –

+0

Ok, ich habe es bearbeitet. – WolfgangS

Antwort

1

Erstens, wenn Sie einen tragbaren Abhilfe möchten, können Sie tun:

#if __cplusplus < 201103L && _MSVC_LANG < 201103L 
/* ... */ 
#elif __cplusplus >= 201402L || _MSVC_LANG >= 201402L 

Der Kommentar Sie besagt verknüpfen, dass es ein Fehler ist, dass __cplusplus nicht richtig eingestellt ist und dass die Prüfung _MSVC_LANG ist eine Notlösung. VC 2017 (19.10.25017) mit /std:c++14 setzt jedoch immer noch __cplusplus bis 199711. Ich bin mir nicht sicher, ob das bedeutet, dass die C++ 14-Unterstützung immer noch nicht vollständig ist, oder wenn sie einfach nie dazu gekommen sind.

Das _MSVC_LANG Makro ist eine Microsoft-Erweiterung. Die meisten anderen Compiler setzen es nicht, um es einfacher zu machen, zu testen, ob der Compiler Microsoft ist oder nicht. (Eine Ausnahme: clang++ --std:c++14 -fms-compatibility-version=19.10 wird sowohl __cplusplus und _MSVC_LANG auf 201402L gesetzt, wie das sein ist MSVC Kompatibilitätsmodus.)

Verwandte Themen