_Static_assert keyword and static_assert macro (C11)

Tests an assertion at compile time. If the specified constant expression is false, the compiler displays the specified message and the compilation fails with error C2338; otherwise, there's no effect. New in C11.

_Static_assert is a keyword introduced in C11. static_assert is a macro, introduced in C11, that maps to the _Static_assert keyword.

Syntax

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

Parameters

constant-expression
An integral constant expression that can be evaluated at compile time. If the expression is zero (false), displays the string-literal parameter and the compilation fails with an error. If the expression is nonzero (true), then there's no effect.

string-literal
The message displayed if constant-expression evaluates to zero (false). The message must be made using the base character set of the compiler. The characters can't be multibyte or wide characters.

Remarks

The _Static_assert keyword, and the static_assert macro, both test a software assertion at compile time. They can be used at global or function scope.

In contrast, the assert macro and _assert and _wassert functions test a software assertion at runtime and incur a runtime cost.

Microsoft-specific behavior

In C, when you don't include <assert.h>, the Microsoft compiler treats static_assert as a keyword that maps to _Static_assert. Using static_assert is preferred because the same code will work in both C and C++.

Example of a compile-time assert

In the following example, static_assert and _Static_assert are used to verify how many elements are in an enum and that integers are 32 bits wide.

// 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;
}

Requirements

Macro Required header
static_assert <assert.h>

Compile with /std:c11.

Windows SDK 10.0.20348.0 (version 2104) or later. For more information on installing the Windows SDK for C11 and C17 development, see Install C11 and C17 support in Visual Studio.

See also

_STATIC_ASSERT Macro
assert macro and _assert and _wassert functions /std (Specify language standard version)