Przejdź do zawartości

C/assert

Z Wikibooks, biblioteki wolnych podręczników.
< C

Deklaracja

[edytuj]
#define assert(expr)

Plik nagłówkowy

[edytuj]
assert.h

Opis

[edytuj]
Makro przypominające w użyciu funkcję, służy do debuggowania programów. Gdy testowany warunek logiczny expr przyjmuje wartość fałsz, na standardowe wyjście błędów wypisywany jest komunikat o błędzie (zawierające m.in. argument wywołania makra; nazwę funkcji, w której zostało wywołane; nazwę pliku źródłowego oraz numer linii w formacie zależnym od implementacji) i program jest przerywany poprzez wywołanie funkcji abort.
W ten sposób możemy oznaczyć w programie niezmienniki, czyli warunki, które niezależnie od wartości zmiennych muszą pozostać prawdziwe. Jeśli asercja zawiedzie, oznacza to, że popełniliśmy błąd w algorytmie, piszemy sobie po pamięci (nadając zmiennym wartości, których nigdy nie powinny mieć) albo nastąpiła po drodze sytuacja wyjątkowa, na przykład związana z obsługą operacji wejścia-wyjścia.
Można łatwo pozbyć się asercji[1], uwalniając kod od spowalniających obciążeń a jednocześnie nie musząc kasować wystąpień assert i zachowując je na przyszłość. Aby to zrobić, należy przed dołączeniem pliku nagłówkowego assert.h zdefiniować makro NDEBUG, wówczas makro assert przyjmuje postać:
#define assert(ignore) ((void)0)
Makro assert jest redefiniowane za każdym dołączeniem pliku nagłówkowego assert.h.

Wartość zwracana

[edytuj]
Makro nie zwraca żadnej wartości.

Przykład

[edytuj]
#include <assert.h>
 
int main()
{
    int err=1;
    assert(err==0);
    return 0;
}

Program wypisze komunikat podobny do:

Assertion failed: err==0, file test.c, line 6

Natomiast jeśli uruchomimy:

#define NDEBUG
#include <assert.h>
   
int main()
{
    int err=1;
    assert(err==0);
    return 0;
}

nie pojawi się żaden komunikat o błędach (za sprawą NDEBUG)

  1. geeksforgeeks: assertions