静态断言
来自cppreference.com
语法
_Static_assert ( 表达式 , 消息 )
|
(C11 起)(C23 中弃用) | ||||||||
static_assert ( 表达式 , 消息 )
|
(C23 起) | ||||||||
_Static_assert ( 表达式 )
|
(C11 起)(C23 中弃用) | ||||||||
static_assert ( 表达式 )
|
(C23 起) | ||||||||
表达式 | - | 任何整数常量表达式 |
消息 | - | 任何字符串字面量 |
此关键词亦可用作便利宏 static_assert,于头文件 <assert.h> 中提供。 |
(C23 前) |
实现亦可定义 |
(C23 起) |
解释
在编译时求值该常量表达式并将它与零比较。若它比较等于零,则发生编译错误,而编译器必须将 消息 作为错误消息的一部分显示(但不要求显示基本字符集以外的字符) (C23 前)在提供 消息 时应该将它作为错误消息的一部分显示 (C23 起)。
否则,若 表达式 不等于零,则什么都不发生;不生成代码。
关键词
示例
运行此代码
#include <assert.h> // C23 起不再需要 int main(void) { // 测试数学是否正常工作,C23: static_assert((2 + 2) % 3 == 1, "Whoa dude, you knew!"); // C23 之前的替代方案: _Static_assert(2 + 2 * 2 == 6, "Lucky guess!?"); // 这会在编译时产生错误。 // static_assert(sizeof(int) < sizeof(char), "Unmet condition!"); constexpr int _42 = 2 * 3 * 2 * 3 + 2 * 3; static_assert(_42 == 42); // 可以省略消息字符串 // const int _13 = 13; // 编译时错误 - 并非整数常量表达式: // static_assert(_13 == 13); }
引用
- C23 标准(ISO/IEC 9899:2024):
- 6.7.11 Static assertions (第 TBD 页)
- C17 标准(ISO/IEC 9899:2018):
- 6.7.10 Static assertions (第 105 页)
- 7.2 Diagnostics <assert.h> (第 135 页)
- C11 标准(ISO/IEC 9899:2011):
- 6.7.10 Static assertions (第 145 页)
- 7.2 Diagnostics <assert.h> (第 186-187 页)
参阅
若用户指定的条件非true,则异常终止程序。可以在发行版本禁用。 (宏函数) |