有什么办法可以将 _Static_assert 插入 ISO C11 中的表达式中吗?

Is there any way to slip a _Static_assert into an expression in ISO 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 会很不方便,因为你不走运基于预处理器宏的伪函数然后验证它们的参数。

不幸的是,

_Static_assert 是一种特殊的 声明 ,不是函数或运算符。除非您使用非标准的东西,否则您将无法将其放入表达式中。例如。编译器扩展,例如 GCC 的 "statement expressions"

int b = ({ _Static_assert(2 > 1, "all is lost"); 304; });

int b = (({ _Static_assert(2 > 1, "all is lost"); }), 304);

这在 ISO C11 中是可行的。诀窍是将 _Static_assert 放在结构声明中,在 sizeof 表达式中:

sizeof(struct { _Static_assert(0, "yay it failed"); int dummy; })

根据 clang -std=c11 -Weverything.

,由于 empty struct is a GNU extension,虚拟字段是必需的