Eine versehentliche Makrosubstitution ist eine unbeabsichtigte Verwendung eines Makros, dessen Name mit einer Funktion in Konflikt steht.
Die Situation Vera ++ 's Kontrollen ausgelegt tritt zu verhindern, wenn System-Header misbehaved - am bekanntesten <windows.h>
- definieren min
und max
Makros, die mit der Anwendung definierte Funktionen mit dem gleichen Namen oder sogar mit Standard-Bibliotheksfunktionen wie std::min<T>
, std::max<T>
stören, und std::numeric_limits<T>::min()
. (Andere Namen wurden bekannt Auseinandersetzungen auch verursachen.)
Da Makros werden Namespace-aware, die Funktionen als std
::min(...)
Aufruf hilft nicht, weil min
noch durch den Präprozessor erweitert wird. Um dieses Problem zu umgehen, müssen solche Funktionen als (function)(args...)
aufgerufen werden, wodurch eine Makroexpansion verhindert wird, vorausgesetzt, sie ist als #define function(arg1, arg2) ...
definiert, wie dies typischerweise bei min
und max
der Fall ist. Eine andere verfügbare Option ist #undef
sie vor der Verwendung, aber nach dem Einfügen der fehlerhaften Header. Boost bietet seinen eigenen Substitutionspräventions-Marker, obwohl seine Selbstbeschreibungsfähigkeit durch die Unordnung, die es einführt, aufgewogen wird.
Wenn Sie die Aufnahme von <windows.h>
steuern, können Sie auch #define NOMINMAX
vor der Aufnahme, die instruiert windows.h
nicht die min
und max
Makros zu definieren.
+1. Völlig unabhängig von dem, was ich ursprünglich für die Frage hielt. Es gibt ein paar andere davon außer Min und Max, soweit ich mich erinnere. – WhozCraig
BOOST_PREVENT_MACRO_SUBSTITUTION ist nur "#define BOOST_PREVENT_MACRO_SUBSTITUTION" (es ist kein Wert definiert). Es ist nur unlesbar, weil sie einen beschreibenden Namen für das Makro auswählen. –
'#define NOMINMAX' hilft auch. – chris