静态断言
Version >= C11
静态断言用于在编译代码时检查条件是否为真。如果不是,则编译器需要发出错误消息并停止编译过程。
静态断言是在编译时检查的,而不是运行时。条件必须是常量表达式,如果为 false 则会导致编译器错误。第一个参数,即检查的条件,必须是常量表达式,第二个参数是字符串文字。
与 assert 不同,_Static_assert
是一个关键字。方便宏 static_assert
在 <assert.h>
中定义。
#include <assert.h>
enum {N = 5};
_Static_assert(N == 5, "N does not equal 5");
static_assert(N > 10, "N is not greater than 10"); /* compiler error */
Version = C99
在 C11 之前,没有直接支持静态断言。但是,在 C99 中,可以使用宏来模拟静态断言,如果编译时条件为 false,则会触发编译失败。与 _Static_assert
不同,第二个参数必须是正确的令牌名称,以便可以使用它创建变量名称。如果断言失败,则在编译器错误中看到变量名称,因为该变量在语法错误的数组声明中使用。
#define STATIC_MSG(msg, l) STATIC_MSG2(msg, l)
#define STATIC_MSG2(msg,l) on_line_##l##__##msg
#define STATIC_ASSERT(x, msg) extern char STATIC_MSG(msg, __LINE__) [(x)?1:-1]
enum { N = 5 };
STATIC_ASSERT(N == 5, N_must_equal_5);
STATIC_ASSERT(N > 5, N_must_be_greater_than_5); /* compile error */
在 C99 之前,你无法在块中的任意位置声明变量,因此你必须非常谨慎地使用此宏,确保它仅出现在变量声明有效的位置。