在C11中写是合法的,例如:
int b = (some_function_returning_void(), 1020);
然后您会回到1020。但是它不会让您写:
int b = (_Static_assert(2 > 1, "all is lost"), 304);
gcc返回
error: expected expression before '_Static_assert'
有时在表达式之外使用_Static_assert
会很不方便,因为您对基于预处理器宏的伪函数无法通过验证它们的参数感到不满意。
答案 0 :(得分:5)
_Static_assert
是一种特殊的声明,而不是函数或运算符。除非您使用非标准的东西,否则您将无法将其滑入表达式中。例如。诸如GCC的“语句表达式”之类的编译器扩展
int b = ({ _Static_assert(2 > 1, "all is lost"); 304; });
或
int b = (({ _Static_assert(2 > 1, "all is lost"); }), 304);
答案 1 :(得分:1)
这在ISO C11中是可行的。诀窍是将_Static_assert
放在一个sizeof表达式的结构声明中:
sizeof(struct { _Static_assert(0, "yay it failed"); int dummy; })
根据empty struct is a GNU extension
,因为clang -std=c11 -Weverything
,所以必须使用虚拟字段。