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必须是常量表达式,编译期可计算的。方法四可以用于代码块以外。