Ответ 1
void Foo() __attribute__((deprecated));
#define MY_DEPRECATED_BEGIN \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic warning \"-Wdeprecated-declarations\"")
int main()
{
MY_DEPRECATED_BEGIN
Foo();
#pragma clang diagnostic pop
}
Короткий ответ на ваш технический вопрос заключается в том, что C99 предоставляет конструкцию _Pragma("foo")
, которая эквивалентна #pragma foo
, но обрабатывается чуть позже и не обязательно должна быть в отдельной строке.
Другая проблема заключается в том, что -Wdeprecated-declarations
не делает то, что, по вашему мнению, делает. Просто объявление функции как устаревшей никогда не даст вам диагностики, потому что предполагается, что __attribute__((deprecated))
используется (как правило, в заголовочных файлах). Что вызывает диагностику, если вы используете устаревшую функцию - и в этот момент становится актуальной установка -Wdeprecated
.
Если вы действительно хотите отказаться от Foo
iff MY_DEPRECATED
, тогда правильный способ сделать это
#ifdef MY_DEPRECATED
#define ATTRIBUTE_DEPRECATED __attribute__((deprecated))
#else
#define ATTRIBUTE_DEPRECATED
#endif
void Foo() ATTRIBUTE_DEPRECATED;