静态断言

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 之前,你无法在块中的任意位置声明变量,因此你必须非常谨慎地使用此宏,确保它仅出现在变量声明有效的位置。