Вы можете убедиться, что эти макросы будут расширены до чего-то, что будет включать выражение, которое вызовет предупреждение attribute ((устарело)).
Для функционально-подобных макросов это довольно легко (особенно с оператором запятой), но для константных определений или нестандартных макросов это может быть более сложным, поскольку контекст, в котором они раскрываются, отличается.
Я думаю, что вы могли бы сделать:
#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)