поместить #warning внутри тела # define - PullRequest
6 голосов
/ 21 января 2011

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

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

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

Ответы [ 3 ]

4 голосов
/ 21 января 2011

GCC поддерживает оператор C99 _Pragma и даже поставляется с примером кода для вашего варианта использования .

4 голосов
/ 21 января 2011

В MSVS 2010 есть это:

 #pragma deprecated( identifier1 [,identifier2, ...] )

не знаю о других компиляторах

и для Microsoft:

__declspec(deprecated) void func1(int) {}
__declspec(deprecated("** this is a deprecated function **")) void func2(int) {}
__declspec(deprecated(MY_TEXT)) void func3(int) {}
3 голосов
/ 21 января 2011

Вы не можете создать #pragma или #warning с макросом, но я думаю, что вы можете сделать что-то вроде:

#ifdef __GNUC__
# define Y_Warning(x) message x
#else
# define Y_Warning(x) message(x)
#endif

#pragma Y_Warning("Symbol A is depreboned. Use predefined const cnA instead.")
#pragma Y_Warning("Symbol B is depronated. Use predefined const cnB instead.")
#pragma Y_Warning("Symbol C is deprecuted. Use predefined const cnC instead.")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...