я Знаю, как использовать атрибут, удержанный от использования для осуждения функции как это:
int old_fn () __attribute__ ((deprecated));
Но как удержать от использования Макрос как это:
#define OLD_MACRO 1
Заранее спасибо.
Eric
Вы можете убедиться, что эти макросы будут расширяться до чего-то, что будет включать выражение, которое вызовет предупреждение ((устарело)) атрибута .
Для функционально-подобных макросов это довольно просто (особенно с оператором запятой), но для константных определений или нестандартных макросов это может быть более сложным, поскольку контекст, в котором они раскрываются, отличается. Я думаю, вы могли бы сделать:
#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)
Поскольку макросы не являются частью компилятора (они являются функцией препроцессора), нет чистого способа сделать это. В лучшем случае поместите устаревшие макросы в новый файл заголовка, заполненный #warnings. Это, конечно, нарушит существующий код, но это единственный способ гарантировать привлечение внимания к устареванию.
Я думаю, что лучшее, что вы можете сделать, это что-то вроде этого:
#ifdef USE_DEPRECATED_MACROS
#warning using deprecated macros
#define OLD_MACRO 1
...
#endif
Таким образом, вы заставляете пользователя, например, добавить -DUSE_DEPRECATED_MACROS к параметрам компилятора и получает предупреждение.