In einem Header, der in C- und C++-Dateien kompiliert werden sollte, in Visual Studio (2010) und MinGW (32-Bit - v3.4.5, 64-Bit - v4.5.0) versuche ich, die Größe zu minimieren, indem ich jede einzelne dieser Zeilen ändere (es gibt viele davon):
// for symbol A
#ifdef __GNUC__
# warning Symbol A is deprecated. Use predefined const cnA instead.
#else
# pragma message("Symbol A is deprecated. Use predefined const cnA instead.")
#endif
// Same for B
// Same for C
// . . .
zu
// define this once:
#ifdef __GNUC__
# define X_Warning(x) #warning "Symbol " x " is deprecated. Use cn" x // (1)
#else
# define X_Warning(x) __pragma(message("Symbol " x " is deprecated. Use cn" x "))
#endif
// and use like this:
X_Warning("A")
X_Warning("B")
X_Warning("C")
oder zumindest zu diesem:
// define this once:
#ifdef __GNUC__
# define Y_Warning(x) #warning x // (2)
#else
# define Y_Warning(x) __pragma(message(x))
#endif
// and use like this:
Y_Warning("Symbol A is deprecated. Use predefined const cnA instead.")
Y_Warning("Symbol B is deprecated. Use predefined const cnB instead.")
Y_Warning("Symbol C is deprecated. Use predefined const cnC instead.")
. . .
Aber die mit (1) markierte Zeile funktioniert nicht.
__pragma
ist das Äquivalent von Microsoft für #pragma
für diese Art von Situationen zu verwenden.
- Was ist der richtige Weg, um dies zu tun?
- Ist das bei MinGW/gcc überhaupt möglich?
- ist
__GNU__
das richtige Symbol für solche Dinge zu verwenden?
P.S. Ich habe vergessen zu erwähnen, dass A, B, C #define-ed Symbole sind. In diesem Fall ist es nicht möglich, mit meinem alten MinGW v3.4.5 zu arbeiten (zumindest in meinem Fall mit dieser speziellen Konfiguration). Und die Antwort von @Edwin ist korrekt.
Aber _Pragma wird von neueren Versionen von MingW unterstützt, und dank einer Antwort von @Christoph ist es möglich, wie folgt zu verfahren:
// define this once:
#ifdef __GNUC__
# define DO_PRAGMA(x) _Pragma (#x)
# define X_Warning(x) DO_PRAGMA( message "Symbol " #x " is deprecated. Use cn" x )
#else
# define X_Warning(x) __pragma(message("Symbol " x " is depricated. Use cn" x ))
#endif
// and use like this:
#ifdef A
X_Warning("A")
#endif
#ifdef C
X_Warning("B")
#endif
#ifdef B
X_Warning("C")
#endif
Das Markieren als veraltet scheint in einigen Fällen zu funktionieren, aber nicht bei mir. Es erfordert, dass Sie veraltete Symbole vor ihrer Verwendung definieren, was nicht mein Fall ist und außerhalb meiner Kontrolle liegt.