_Static_assert 关键字和 static_assert 宏 (C11)

在编译时测试断言。 如果指定的常数表达式为 false,则编译器显示指定的消息,并且编译失败,错误为 C2338;否则,不会产生任何影响。 C11 中的新增功能。

_Static_assert 是 C11 中引入的关键字。 static_assert 是 C11 中引入的宏,它映射到 _Static_assert 关键字。

语法

_Static_assert(constant-expression, string-literal);
static_assert(constant-expression, string-literal);

parameters

constant-expression
可在编译时计算的整型常数表达式。 如果表达式为零 (false),则显示 string-literal 参数,并且编译因出错而失败。 如果表达式不为零 (true),则不会产生任何影响。

string-literal
如果 constant-expression 计算结果为零 (false),则显示此消息。 此消息必须使用编译器的基本字符集来生成。 字符不能为多字节字符或宽字符

备注

_Static_assert 关键字和 static_assert 宏均在编译时测试软件断言。 它们可用于全局或函数范围。

相反,assert 宏、_assert_wassert 函数在运行时测试软件断言,并产生运行时成本。

Microsoft 特定行为

在 C 中,如果不包含 <assert.h>,Microsoft 编译器会将 static_assert 视为映射到 _Static_assert 的关键字。 首选使用 static_assert,因为相关代码在 C 和 C++ 中均适用。

编译时断言示例

在下面的示例中,static_assert_Static_assert 用于验证枚举中有多少个元素以及整数的宽度是否为 32 位。

// requires /std:c11 or higher
#include <assert.h>

enum Items
{
    A,
    B,
    C,
    LENGTH
};

int main()
{
    // _Static_assert is a C11 keyword
    _Static_assert(LENGTH == 3, "Expected Items enum to have three elements");

    // Preferred: static_assert maps to _Static_assert and is compatible with C++
    static_assert(sizeof(int) == 4, "Expecting 32 bit integers"); 

    return 0;
}

要求

必需的标头
static_assert <assert.h>

使用 /std:c11 进行编译。

Windows SDK 10.0.20348.0(版本 2104)或更高版本。 有关为 C11 和 C17 开发安装 Windows SDK 的更多信息,请参阅在 Visual Studio 中安装 C11 和 C17 支持

另请参阅

_STATIC_ASSERT
assert 宏、_assert_wassert 函数/std(指定语言标准版本)