Spec-Zone.ru › C

Статическое утверждение (с C11)

Синтаксис

_Static_assert ( выражение , сообщение ) (с C11)(устаревшее в C23)
static_assert ( выражение , сообщение ) (с C23)
_Static_assert ( выражение ) (с C23)(устаревшее в C23)
static_assert ( выражение ) (с C23)
выражение - любое целочисленное константное выражение
сообщение - любое строковое литерал

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

(до C23)

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

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

(с C23)

Объяснение

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

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

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

_Static_assert, static_assert

Пример

#include <assert.h> // no longer needed since C23
 
int main(void)
{
    // Test if math works, C23:
    static_assert((2 + 2) % 3 == 1, "Whoa dude, you knew!");
    // Pre-C23 alternative:
    _Static_assert(2 + 2 * 2 == 6, "Lucky guess!?");
 
    // This will produce an error at compile time.
    // static_assert(sizeof(int) < sizeof(char), "Unmet condition!");
 
    constexpr int _42 = 2 * 3 * 2 * 3 + 2 * 3;
    static_assert(_42 == 42); // the message string can be omitted.
 
    // const int _13 = 13;
    // Compile time error - not an integer constant expression:
    // static_assert(_13 == 13);
}

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2023):
    • 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)

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/language/_Static_assert

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API