Поделиться через


Ключевое слово _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);

Параметры

constant-expression
Целочисленное константное выражение, которое можно полностью вычислить во время компиляции. Если выражение равно нулю (false), отображается параметр string-literal и компиляция завершается с ошибкой. Если выражение не равно нулю (true), то не имеет силы.

string-literal
Сообщение, отображаемое, если значение constant-expression равно нулю (false). Сообщение должно быть создано на основе базовой кодировки компилятора. Не допускается использование многобайтовых или расширенных символов.

Remarks

Ключевое слово _Static_assert и макрос static_assert позволяют проверить программное утверждение во время компиляции. Их можно использовать как на глобальном уровне, так и в области действия функции.

В отличие от этого макрос assert а также функции _assert и _wassert используются для проверки программного утверждения во время выполнения, что предполагает дополнительные затраты ресурсов времени выполнения.

Поведение в системах Майкрософт

В C при отсутствии <assert.h> компилятор Майкрософт обрабатывает 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;
}

Requirements (Требования)

Макрос Обязательный заголовок
static_assert <assert.h>

Выполните сборку с помощью команды /std:c11.

Пакет Windows SDK 10.0.20348.0 (версия 2104) или выше. Дополнительные сведения об установке пакета Windows SDK для разработки с использованием C11 и C17 см. в статье Установка поддержки C11 и C17 в Visual Studio.

См. также

_STATIC_ASSERTМакрос
Макрос assert, а также функции _assert и _wassert/std (стандартная версия языка)