размещение #warning внутри тела #define

В заголовке, который должен быть компилирован в файлах 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 для использования в подобных ситуациях.

  1. Как правильно это сделать?
  2. Возможно ли это вообще для MinGW / gcc?
  3. - это __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

Пометка как устаревшая в некоторых случаях работает, но не для меня. Это требует от вас определения устаревших символов перед их использованием, что не в моем случае и вне моего контроля.

6
задан sny 21 January 2011 в 20:35
поделиться