Visual Studio 2012 __cplusplus und C ++ 11

Wer weiß, warum __cplusplus in meinem Visual Studio 2012-C ++ – Projekt als 199711L (das ist das “alte” C ++) definiert ist? Sollte es 201103L nicht sagen, seit VS 2012 jetzt C ++ 11 Unterstützung hat? Selbst wenn ich C ++ 11-Header einfüge, ist es immer noch falsch definiert. Irgendwelche Hinweise?

Dies wurde bereits zur Überprüfung an Microsoft übermittelt:

Ein Wert des vordefinierten Makros __cplusplus ist immer noch 199711L

Es hängt wirklich davon ab, was Sie erwarten, dass Makro tatsächlich bedeutet. Sollte 201103L meinen “Dieser Compiler unterstützt vollständig sowohl C ++ 11 im Compiler als auch in der Bibliothek?” Sollte es bedeuten “Dieser Compiler unterstützt eine vernünftige Teilmenge von C ++ 11?” Sollte es bedeuten “Dieser Compiler unterstützt mindestens ein C ++ 11-Feature in irgendeiner Weise, Form oder Form?”

Es ist wirklich Sache jeder Implementierung, zu entscheiden, wann die Versionsnummer überschritten wird. Visual Studio unterscheidet sich von Clang und GCC, da es keinen separaten C ++ 03-Kompilierungsmodus hat; Es bietet eine bestimmte Reihe von functionen, und das ist es, was es bietet.

Im Allgemeinen ist ein einzelnes Makro kein nützliches Werkzeug, um zu entscheiden, wann ein Feature verwendet werden soll. Boost.Config ist ein weitaus zuverlässigerer Mechanismus. Das Normengremium untersucht Möglichkeiten, dieses Problem in zukünftigen Versionen des Standards zu lösen .

Ich bin mit Nicol hier. Der einzige Grund für einen Test auf __cplusplus >= 201103L besteht darin, zu prüfen, ob Sie die neuen functionen verwenden können. Wenn ein Compiler nur die Hälfte der neuen Features implementiert, aber den neuen Wert von __cplusplus , wird es nicht möglich sein, eine Menge gültigen C ++ 11-Code zu kompilieren, der durch __cplusplus >= 201103L geschützt ist (ich habe einige, die thread_local und *this Referenzen verwenden). . Wenn es andererseits 199711L hält, wird es den sicheren C ++ 98-Code verwenden, der immer noch gut ist. Es kann einige Optimierungen auf diese Weise verpassen, aber Sie können immer noch andere Methoden verwenden, um festzustellen, ob ein bestimmtes Feature verfügbar ist (Compilerversion, Compiler-spezifische Makros wie __GXX_EXPERIMENTAL_CXX0X__ , Boost-Makros, die Compiler-Makros für Sie prüfen usw.). Was zählt, ist ein sicherer Standard.

Es gibt zwei mögliche Gründe, auf den neuen Wert von __cplusplus umzuschalten:

  • Ihr Compiler hat volle Unterstützung für C ++ 11 (oder nahe genug, es wird immer Bugs geben)
  • Dies ist ein experimenteller Modus Ihres Compilers, der nicht in der Produktion verwendet werden sollte, und was normalerweise fehlende Features wären, zählen als Bugs.

Soweit ich weiß, sind alle Compiler, die geschaltet haben, in der zweiten Kategorie.

Ich glaube, einige Compiler-Anbieter waren viel zu begeistert, den Wert von __cplusplus zu ändern (einfachste C ++ 11-function zu implementieren, gute Publicity), und es ist gut, dass einige eher konservativ sind.

Ab April 2018 meldet MSVC 2017 das Makro nun korrekt, allerdings nur, wenn ein bestimmter Schalter verwendet wird (/ Zc: __ cplusplus). Dies liegt daran, dass viel alter Code darauf angewiesen ist, den alten Wert des Makros für MSVC-Compiler zu erkennen. Quelle: https://blogs.msdn.microsoft.com/vcblog/2018/04/09/msvc-now-correctly-reports-__cplusplus/

Wenn die Menschen weltweit ihren Code aktualisiert haben, wird MS hoffentlich in Zukunft das Makro standardmäßig korrekt melden.