Namespaces
Variants

Static assertion (since C11)

From cppreference.net

Contenidos

Sintaxis

_Static_assert ( expresión , mensaje ) (desde C11) (obsoleto en C23)
static_assert ( expresión , mensaje ) (desde C23)
_Static_assert ( expresión ) (desde C23) (obsoleto en C23)
static_assert ( expresión ) (desde C23)
expresión - cualquier expresión constante entera
mensaje - cualquier literal de cadena

Esta palabra clave también está disponible como macro de conveniencia static_assert , disponible en el encabezado <assert.h> .

(hasta C23)

Tanto static_assert como _Static_assert tienen los mismos efectos. _Static_assert es una ortografía obsoleta que se mantiene por compatibilidad.

Una implementación también puede definir static_assert y/o _Static_assert como macros predefinidas, y static_assert ya no es proporcionado por <assert.h> .

(desde C23)

Explicación

La expresión constante se evalúa en tiempo de compilación y se compara con cero. Si la comparación es igual a cero, ocurre un error en tiempo de compilación y el compilador debe mostrar message como parte del mensaje de error (excepto que los caracteres que no están en el basic character set no requieren ser mostrados) (until C23) debería mostrar message (si se proporciona) como parte del mensaje de error (since C23) .

De lo contrario, si expression no es igual a cero, no sucede nada; no se emite ningún código.

Palabras clave

_Static_assert , static_assert

Ejemplo

#include <assert.h> // ya no es necesario desde C23
int main(void)
{
    // Probar si las matemáticas funcionan, C23:
    static_assert((2 + 2) % 3 == 1, "Whoa dude, you knew!");
    // Alternativa pre-C23:
    _Static_assert(2 + 2 * 2 == 6, "Lucky guess!?");
    // Esto producirá un error en tiempo de compilación.
    // static_assert(sizeof(int) < sizeof(char), "Unmet condition!");
    constexpr int _42 = 2 * 3 * 2 * 3 + 2 * 3;
    static_assert(_42 == 42); // la cadena de mensaje puede omitirse.
    // const int _13 = 13;
    // Error en tiempo de compilación - no es una expresión constante entera:
    // static_assert(_13 == 13);
}

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 6.7.11 Static assertions (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 6.7.10 Static assertions (p: 105)
  • 7.2 Diagnostics <assert.h> (p: 135)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 6.7.10 Static assertions (p: 145)
  • 7.2 Diagnostics <assert.h> (p: 186-187)

Véase también

aborta el programa si la condición especificada por el usuario no es true . Puede desactivarse para builds de release
(macro de función)
Documentación de C++ para static_assert declaration