Учитывая этот фрагмент кода:
#define STC_ASSERT(X,Msg) \
(!!sizeof(struct{char STC_ASSERT;_Static_assert((X),Msg "");}))
#define A 43
#define B 42
#define C (STC_ASSERT(A-B>=0,"")?(A-B):0)
enum { c = C };
int main()
{
STC_ASSERT(1,""); //can this not generate a warning on gcc?
}
Могу ли я что-нибудь сделать внутри оболочки STC_ASSERT
_Static_assert
, чтобы предотвратить создание строки в main
-Wunused-value
предупреждение при компиляции с gcc -Wall -Wextra
?
(_Pragma
с GCC diagnostic push/pop
здесь не работает. Для такого макроса, как #define FOO 42
, включение его в выражение выражения (({ 42; })
)сделает то же самое, но это предотвратит использование макроса в контекстах, где требуется выражение целочисленной константы (например, определение enum
)