Ключевое слово _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). Сообщение должно быть создано на основе базовой кодировки компилятора. Не допускается использование многобайтовых или расширенных символов.
Замечания
Ключевое слово _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;
}
Требования
Макрос | Обязательный заголовок |
---|---|
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
(стандартная версия языка)