1. 简介

c++17标准引入了static_assert

1static_assert(bool-constexpr, message )     /// since C++11
2static_assert(bool-constexpr)               /// since C++17

gnu c编译器也实现了_Static_assert,见Static Assertions

2. 自定义

在没有static_assert的c语言中,可以自己实现类似的功能,如下:

2.1. 方法一

1#ifndef STATIC_ASSERT
2#define STATIC_ASSERT(exp) ((void)sizeof(struct{int:-!(exp);}))
3#endif

2.2. 方法二

1#ifndef STATIC_ASSERT
2#define STATIC_ASSERT(exp) ((void)sizeof(char[(exp)?1:-1]))
3#endif

2.3. 方法三

1#ifndef STATIC_ASSERT
2#define STATIC_ASSERT(exp) switch(0) { case 0: case (exp):; }
3#endif

2.4. 方法四

推荐:可以在函数内,也可以在函数外。

1#ifndef STATIC_ASSERT
2#define STATIC_ASSERT(exp) extern void _static_assert(int arg[(exp) ? 1 : -1])
3#endif

注意:exp必须是常量表达式,编译期可计算的。方法四可以用于代码块以外。

3. 参考

无警告C语言编译断言