命名空间
变体
操作

静态断言 (自 C11 起)

来自 cppreference.com
< c‎ | 语言

内容

[编辑] 语法

_Static_assert ( 表达式 , 消息 ) (自 C11 起)(在 C23 中已弃用)
static_assert ( 表达式 , 消息 ) (自 C23 起)
_Static_assert ( 表达式 ) (自 C23 起)(在 C23 中已弃用)
static_assert ( 表达式 ) (自 C23 起)
表达式 - 任何 整型常量表达式
消息 - 任何 字符串字面量

此关键字也可用作便利宏 static_assert,它在头文件 <assert.h> 中可用。

(直到 C23)

static_assert_Static_assert 的效果相同。_Static_assert 是一种已弃用的拼写,为了兼容性而保留。

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

(自 C23 起)

[编辑] 解释

常量表达式在编译时求值并与零比较。如果它与零相等,则会发生编译时错误,编译器 必须显示 消息 作为错误消息的一部分(但字符集中不在 基本字符集 中的字符不需要显示)(直到 C23)应该显示 消息(如果提供)作为错误消息的一部分(自 C23 起).

否则,如果 表达式 不等于零,则不会发生任何事情;不会发出任何代码。

[编辑] 关键字

_Static_assertstatic_assert

[编辑] 示例

#include <assert.h> // no longer needed since C23
 
int main(void)
{
    // Test if math works, C23:
    static_assert((2 + 2) % 3 == 1, "Whoa dude, you knew!");
    // Pre-C23 alternative:
    _Static_assert(2 + 2 * 2 == 6, "Lucky guess!?");
 
    // This will produce an error at compile time.
    // static_assert(sizeof(int) < sizeof(char), "Unmet condition!");
 
    constexpr int _42 = 2 * 3 * 2 * 3 + 2 * 3;
    static_assert(_42 == 42); // the message string can be omitted.
 
    // const int _13 = 13;
    // Compile time error - not an integer constant expression:
    // static_assert(_13 == 13);
}

[编辑] 参考

  • C23 标准 (ISO/IEC 9899:2024)
  • 6.7.11 静态断言 (p: TBD)
  • 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 声明