有什么办法可以将 _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
,虚拟字段是必需的
在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
,虚拟字段是必需的