При использовании макроса, который может расширяться до функции с атрибутом noreturn
, есть ли способ остановить его от подавления -Wreturn-type
?
Простой пример:
/* Defined in a separate header. */
#ifndef NDEBUG
# define MY_ASSERT_MACRO(test) ((void)((test) ? 0 : abort()))
#else
# define MY_ASSERT_MACRO(test) ((void)(0 ? 0 : (test)))
#endif
/* C source file. */
int function(enum MyEnum foo)
{
switch (foo) {
case A: return 1;
case B: return 1;
}
MY_ASSERT_MACRO(0);
/* <-- Missing return! This should always warn! */
}
Проблема с этим в сборках выпуска, это дает предупреждение -Wreturn-type
, а в сборках отладки он вообще не дает предупреждения, так как abort имеет атрибут noreturn
.
Я хотел бы получить предупреждение в обоих случаях, чтобы разработчики, использующие отладочные сборки, не нарушали выпускные сборки.
Есть ли (чистый *) способ остановить функцию прерывания от отключения предупреждения -Wreturn-type
?
Не очень чистые способы:
- Прерывание вызова с приведением для удаления атрибута
noreturn
:
((void (*)(void))(*(((void **)abort))))()
- Сравните две вещи, которые теоретически могут быть одинаковыми:
(((const void *)(abort) != (const void *)(stderr)) ? abort() : 0)