C Language Afirmación estática


Ejemplo

C11

Las aserciones estáticas se utilizan para verificar si una condición es verdadera cuando se compila el código. Si no es así, el compilador debe emitir un mensaje de error y detener el proceso de compilación.

Una aserción estática se verifica en el momento de la compilación, no en el tiempo de ejecución. La condición debe ser una expresión constante, y si es falso, se producirá un error del compilador. El primer argumento, la condición que se comprueba, debe ser una expresión constante, y el segundo es un literal de cadena.

A diferencia de aseverar, _Static_assert es una palabra clave. Una macro de conveniencia static_assert se define en <assert.h> .

#include <assert.h>

enum {N = 5};
_Static_assert(N == 5, "N does not equal 5");
static_assert(N > 10, "N is not greater than 10");  /* compiler error */
C99

Antes de C11, no había soporte directo para afirmaciones estáticas. Sin embargo, en C99, las afirmaciones estáticas se pueden emular con macros que desencadenan un error de compilación si la condición de tiempo de compilación es falsa. A diferencia de _Static_assert , el segundo parámetro debe ser un nombre de token adecuado para que se pueda crear un nombre de variable con él. Si la afirmación falla, el nombre de la variable se ve en el error del compilador, ya que esa variable se usó en una declaración de matriz sintácticamente incorrecta.

#define STATIC_MSG(msg, l) STATIC_MSG2(msg, l)
#define STATIC_MSG2(msg,l) on_line_##l##__##msg
#define STATIC_ASSERT(x, msg) extern char STATIC_MSG(msg, __LINE__) [(x)?1:-1]
 
enum { N = 5 };
STATIC_ASSERT(N == 5, N_must_equal_5);
STATIC_ASSERT(N > 5, N_must_be_greater_than_5); /* compile error */

Antes de C99, no podía declarar variables en ubicaciones arbitrarias en un bloque, por lo que tendría que ser extremadamente cuidadoso al usar esta macro, asegurándose de que solo aparezca donde una declaración de variable sería válida.