Assert.h

De la Viquipèdia, l'enciclopèdia lliure
Assert.h

TipusC header file (en) Tradueix Modifica el valor a Wikidata
Part deC standard library, Biblioteca C POSIX i Biblioteca estàndard de C++ Modifica el valor a Wikidata
Característiques tècniques
PlataformaC standard library

assert.h és un fitxer de capçalera de la biblioteca estàndard C. Defineix l'assert de macro del preprocessador C i implementa l'asserció en temps d'execució a C.[1]

assert.h es defineix a ANSI C com a part de la biblioteca estàndard C. En el llenguatge de programació C++, assert.h i < cassert > estan disponibles; tots dos són funcionalment equivalents.

Ús[modifica]

La macro assert implementa l'asserció en temps d'execució. Si l'expressió és falsa, la macro imprimirà un missatge a stderr i cridarà abort(), definit a stdlib.h. El missatge inclou el nom del fitxer d'origen i el número de línia d'origen de les macros __FILE__ i __LINE__, respectivament. Des de C99, el nom de la funció la instrucció assert s'inclou com a (__FUNC__) i la pròpia expressió. A ANSI C, l'expressió de la macro assert es defineix com a enter signat, encara que es pot utilitzar qualsevol expressió que es pugui convertir implícitament a un enter signat. A C99, la macro assert permet explícitament qualsevol tipus escalar.[2] Dos usos comuns de la macro assert són per afirmar que un punter no és nul i per assegurar-se que un índex de matriu és dins dels límits.[3]

A continuació es mostra un programa que utilitza la amcro assert. Aquest programa sempre avaluarà punter com a fals, com a pointer és un punter nul i no apunta a una ubicació de memòria vàlida: [4]

#include <assert.h>
int main()
{
    void* pointer = 0;
    assert(pointer);
    return 0;
}

En compilar el programa i executar-lo, sortirà un missatge semblant al següent:

program: source.c:5: main: Assertion 'pointer' failed.
Aborted (core dumped)

La definició de l' assert</link> la macro canvia en funció de la definició d'una altra macro, NDEBUG. Si NDEBUG es defineix com un nom de macro, la macro assert es defineix com #define assert(ignore) ((void)0), d'aquesta manera, la macro no avalua l'expressió. L'ús de NDEBUG pot afectar el comportament general d'un programa si un o més assert les declaracions contenen efectes secundaris, ja que aquestes declaracions no s'avaluen.

La macro assert no inclou cap missatge d'error. No obstant això, l'operador de coma es pot utilitzar per afegir-lo a l'expressió impresa, com a assert (( "Not Orwellian" , 2 + 2 == 5 )).

static_assert[modifica]

La macro static_assert, afegida a C++11, té un propòsit similar a la macro assert. A diferència de la macro assert, static_assert s'executa en temps de compilació i no en temps d'execució. La implementació original utilitzava hacks de plantilles. La macro static_assert pren una expressió constant que es pot convertir en un literal booleà i un literal de cadena; si l'expressió falla, es retorna el literal de cadena, en cas contrari, la macro no té cap efecte. En C++17, aquest missatge d'error d'asserció es va fer opcional i el missatge posterior s'omet si no s'especifica.

Referències[modifica]

  1. «assert.h(0p) - Linux manual page» (en anglès). [Consulta: 17 desembre 2023].
  2. «Linux Programmer's Manual» (en anglès), August 25, 2002. [Consulta: March 14, 2023].
  3. Reekie, John. «How to use assertions in C» (en anglès). University of California, Berkeley, December 7, 1995. [Consulta: March 14, 2023].
  4. «assert.h (GNU Gnulib)» (en anglès). [Consulta: 17 desembre 2023].