Подтвердить что ты не робот

Как отказаться от макроса в GCC?

i Знайте, как использовать атрибут , но не рекомендуется использовать эту функцию:

int old_fn () __attribute__ ((deprecated));

Но как отказаться от макроса, как это:

#define OLD_MACRO 1

Спасибо заранее.

Эрик

4b9b3361

Ответ 1

Хорошее, элегантное решение, но в зависимости от того, включена ли C99 (работает с gcc 4.8.2 или новее, не тестировалась в более ранних версиях):

#define DEPRECATED_MACRO1 _Pragma ("GCC warning \"'DEPRECATED_MACRO1' macro is deprecated\"") 7
#define DEPRECATED_MACRO2(...) _Pragma ("GCC warning \"'DEPRECATED_MACRO2' macro is deprecated\"") printf(__VA_ARGS__)

int main(int argc, char*argv[])
{
    int n = DEPRECATED_MACRO1;
    DEPRECATED_MACRO2("%d\n", n);
    return 0;
}

Ответ 2

Я думаю, что лучшее, что вы можете сделать, это что-то вроде этого:

#ifdef USE_DEPRECATED_MACROS
#warning using deprecated macros
#define OLD_MACRO 1
...
#endif

Таким образом вы вынуждаете пользователя, например. add -DUSE_DEPRECATED_MACROS к их параметрам компилятора, и они получают предупреждение.

Ответ 3

Вы можете убедиться, что эти макросы будут расширяться до того, что будет включать выражение, которое будет вызывать предупреждение ((устарело)).

Для функционально-подобных макросов это довольно просто (особенно с помощью оператора запятой), но для константных определений или нестандартных макросов это может быть более сложным, так как контекст, в котором эти расширения различны. Я думаю, вы могли бы сделать:

#define DEPRECATE(name) static inline void __attribute__((deprecated)) deprecate_ ## name (void) { ; }
...
#define MAX(x, y) (DEPRECATE(MAX), x>y?x:y)
// yeah, yeah, it repeats args in the body, but it just an example

Для определения константы вы, вероятно, хотите предположить, что тело должно оцениваться без необходимости генерировать код, например, вне тела функции, в целях переключения/случая или в качестве начального значения статической переменной внутри функции.

Это сложно, но вы можете сделать это для многих вещей.

Я хочу, чтобы у C был __builtin_warn (const char *), который работал бы на уровне компилятора (не-препроцессор) и делал бы такие вещи проще.

Изменить

Для определения констант вы можете:

#define THREE (DEPRICATED(THREE),3)

Ответ 4

Поскольку макросы не являются частью компилятора (они являются функцией предварительного процессора), нет чистого способа сделать это. В лучшем случае разместите свои устаревшие макросы в новом заголовочном файле, заполненном #warnings. Разумеется, это приведет к разрыву существующего кода, но его единственный способ гарантировать привлечение внимания к устареванию.