В заголовке, который должен компилироваться в файлах C и C ++, в Visual Studio (2010) и MinGW (32-разрядная версия v3.4.5, 64-разрядная версия v4.5.0) я пытаюсь минимизировать размер изменив каждую из таких строк (их много):
// 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
// . . .
до
// 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")
или, по крайней мере, на это:
// 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.")
. . .
Но строка, помеченная (1), не работает.
__pragma
является эквивалентом Microsoft для #pragma
для использования в подобных ситуациях.
- Как правильно это сделать?
- Возможно ли это даже для MinGW / gcc?
- является
__GNU__
правильным символом для таких вещей?
P.S. Я забыл упомянуть, что A, B, C .. являются # определенными символами. В этом случае это невозможно сделать с моим старым MinGW v3.4.5 (по крайней мере, в моем случае с этой конкретной конфигурацией). И ответ @ Эдвина правильный.
Но _Pragma поддерживается более новыми версиями MingW и, благодаря @Christoph за ответ, можно сделать следующее:
// 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
Маркировка как устаревшая в некоторых случаях работает, но не для меня. Это требует, чтобы вы определили устаревшие символы перед их использованием, что не в моем случае и вне моего контроля.