有什么方法可以将_Static_assert放入ISO C11中的表达式中?

时间:2018-07-17 18:44:54

标签: c c11

在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会很不方便,因为您对基于预处理器宏的伪函数无法通过验证它们的参数感到不满意。

2 个答案:

答案 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,所以必须使用虚拟字段。