Namespaces
Variants

Static assertion (since C11)

From cppreference.net

Содержание

Синтаксис

_Static_assert ( выражение , сообщение ) (с C11) (устарело в C23)
static_assert ( выражение , сообщение ) (с C23)
_Static_assert ( выражение ) (с C23) (устарело в C23)
static_assert ( выражение ) (с C23)
expression - любой integer constant expression
message - любой string literal

Этот ключевое слово также доступно как удобный макрос static_assert , доступный в заголовочном файле <assert.h> .

(до C23)

Оба варианта static_assert и _Static_assert имеют одинаковый эффект. _Static_assert является устаревшим написанием, сохранённым для совместимости.

Реализация может также определять static_assert и/или _Static_assert как предопределённые макросы, и static_assert больше не предоставляется через <assert.h> .

(начиная с C23)

Объяснение

Константное выражение вычисляется во время компиляции и сравнивается с нулём. Если оно равно нулю, возникает ошибка компиляции, и компилятор должен отобразить message как часть сообщения об ошибке (за исключением того, что символы не из basic character set не обязаны отображаться) (until C23) должен отобразить message (если предоставлен) как часть сообщения об ошибке (since C23) .

В противном случае, если expression не равно нулю, ничего не происходит; никакой код не генерируется.

Ключевые слова

_Static_assert , static_assert

Пример

#include <assert.h> // больше не требуется начиная с C23
int main(void)
{
    // Проверка работы математики, C23:
    static_assert((2 + 2) % 3 == 1, "Ух ты, ты знал!");
    // Альтернатива до C23:
    _Static_assert(2 + 2 * 2 == 6, "Угадал!?");
    // Это вызовет ошибку на этапе компиляции.
    // static_assert(sizeof(int) < sizeof(char), "Невыполненное условие!");
    constexpr int _42 = 2 * 3 * 2 * 3 + 2 * 3;
    static_assert(_42 == 42); // строку сообщения можно опустить.
    // const int _13 = 13;
    // Ошибка компиляции - не целочисленное константное выражение:
    // static_assert(_13 == 13);
}

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 6.7.11 Статические утверждения (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 6.7.10 Статические утверждения (стр: 105)
  • 7.2 Диагностика <assert.h> (стр: 135)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 6.7.10 Статические утверждения (стр: 145)
  • 7.2 Диагностика <assert.h> (стр: 186-187)

Смотрите также

прерывает выполнение программы, если заданное пользователем условие не является true . Может быть отключено для релизных сборок
(макрос функции)
C++ documentation для static_assert declaration