palavra-chave _Static_assert e macro static_assert (C11)

Testa uma asserção no tempo de compilação. Se a expressão constante especificada for false, o compilador exibirá a mensagem especificada e a compilação falhará com o erro C2338; caso contrário, não terá efeito. Novo no C11.

_Static_assert é uma palavra-chave introduzida em C11. static_assert é uma macro, introduzida no C11, que mapeia para a palavra-chave _Static_assert.

Sintaxe

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

Parâmetros

constant-expression
Uma expressão constante integral é uma expressão que pode ser avaliada no tempo de compilação. Se a expressão for zero (false), mostra o parâmetro string-literal e a compilação falhará com um erro. Se a expressão for diferente de zero (verdadeiro), então não terá efeito.

string-literal
A mensagem exibida se constant-expression avaliada como zero (falso). A mensagem precisa ser criada usando o conjunto de caracteres base do compilador. Os caracteres não podem ser caracteres multibyte ou largos.

Comentários

A palavra-chave _Static_assert e a macro static_assert testam uma instrução de declaração de software no tempo de compilação. Elas podem ser usadas no escopo global ou de função.

Por outro lado, a macro assert e as funções _assert e _wassert testam uma asserção de software em runtime e incorrem em um custo de runtime.

Comportamento específico da Microsoft

Em C, quando você não inclui <assert.h>, o compilador da Microsoft trata static_assert como uma palavra-chave mapeada para _Static_assert. É preferível usar static_assert porque o mesmo código funcionará em C e C++.

Exemplo de uma declaração de tempo de compilação

No exemplo a seguir, static_assert e _Static_assert são usados para verificar quantos elementos estão em uma enumeração e se os inteiros têm 32 bits de largura.

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

Requisitos

Macro Cabeçalho necessário
static_assert <assert.h>

Compilar com /std:c11.

SDK do Windows 10.0.20348.0 (versão 2104) ou posterior. Para obter mais informações sobre como instalar o SDK do Windows para desenvolvimento C11 e C17, consulte Instalar suporte de C11 e C17 no Visual Studio.

Confira também

Macro _STATIC_ASSERT
Macro assert e funções _assert e _wassert/std (especifique a versão padrão de linguagem)