Как удержать от использования макрос в GCC?

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

int old_fn () __attribute__ ((deprecated));

Но как удержать от использования Макрос как это:

#define OLD_MACRO 1

Заранее спасибо.

Eric

13
задан Leandros 22 April 2016 в 20:15
поделиться

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's just an example

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

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

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

править

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

#define THREE (DEPRICATED(THREE),3)
5
ответ дан 1 December 2019 в 21:24
поделиться

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

1
ответ дан 1 December 2019 в 21:24
поделиться

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

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

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

8
ответ дан 1 December 2019 в 21:24
поделиться