Namespaces
Variants

Static assertion (since C11)

From cppreference.net

目录

语法

_Static_assert ( 表达式 , 消息 ) (自 C11 起) (C23 中弃用)
static_assert ( 表达式 , 消息 ) (自 C23 起)
_Static_assert ( 表达式 ) (自 C23 起) (C23 中弃用)
static_assert ( 表达式 ) (自 C23 起)
expression - 任意 整数常量表达式
message - 任意 字符串字面量

该关键字也可作为便捷宏 static_assert 使用,该宏位于头文件 <assert.h> 中。

(C23 前)

static_assert _Static_assert 具有相同效果。 _Static_assert 是为兼容性保留的已弃用拼写形式。

实现也可将 static_assert 和/或 _Static_assert 定义为预定义宏,且 <assert.h> 不再提供 static_assert

(C23 起)

说明

常量表达式在编译时被求值并与零进行比较。若比较结果等于零,则发生编译时错误,且编译器 必须将 message 作为错误信息的一部分显示(但 基本字符集 之外的字符无需显示) (C23前) 应显示 message (若提供)作为错误信息的一部分 (C23起)

否则,如果 expression 不等于零,则不会发生任何操作;不会生成任何代码。

关键词

_Static_assert , static_assert

示例

#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 静态断言 (p: 待定)
  • C17 标准 (ISO/IEC 9899:2018):
  • 6.7.10 静态断言 (p: 105)
  • 7.2 诊断 <assert.h> (p: 135)
  • C11 标准 (ISO/IEC 9899:2011):
  • 6.7.10 静态断言 (p: 145)
  • 7.2 诊断 <assert.h> (p: 186-187)

参见

若用户指定的条件不为 true 则终止程序。发行版本中可能被禁用
(函数宏)
C++ 文档 中的 static_assert 声明