В заголовке, который должен быть компилирован в файлах 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 ' s эквивалент #pragma
для использования в подобных ситуациях.
__GNU __
правильный символ для использования в таких вещах? PS Я забыл упомянуть, что A, B, C .. являются # определенными символами. В этом случае это невозможно сделать с моим старым MinGW v3.4.5 (по крайней мере, в моем случае с этой конкретной конфигурацией). И ответ @ Edwin правильный.
Но _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
Пометка как устаревшая в некоторых случаях работает, но не для меня. Это требует от вас определения устаревших символов перед их использованием, что не в моем случае и вне моего контроля.