C/assert: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Kj (dyskusja | edycje)
mNie podano opisu zmian
Mina86 (dyskusja | edycje)
m Drobne poprawki
Linia 1:
===Deklaracja===
:<tt>#define assert(expr)</tt>
 
 
===Plik nagłówkowy===
:[[C/Biblioteka standardowa/Indeks tematyczny#assert.h|assert.h]]
 
 
===Opis===
:Makro przypominające w użyciu funkcję, służy do debuggowania programów. Gdy testowany warunek logiczny <tt>expr</tt> przyjmuje wartość fałsz, na standardowe wyjście błędów wypisywany jest komunikat o błędzie i(zawierające program jest przerywanym.in. Wargument tenwywołania sposóbmakra; możemynazwę oznaczyćfunkcji, w programiektórej niezmienniki,zostało czyliwywołane; warunki,nazwę którepliku niezależnieźródłowego od wartości zmiennych muszą pozostać prawdziwe. Jeśli asercja zawiedzie, oznacza to, żeoraz popełniliśmynumer błądlinii w algorytmie,formacie piszemyzależnym sobieod po pamięci (nadając zmiennym wartości, których nigdy nie powinny miećimplementacji) alboi nastąpiłaprogram pojest drodze sytuacja wyjątkowa, na przykład związanaprzerywany zpoprzez obsługąwywołanie operacjifunkcji wejścia-wyjścia[[C/abort|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, 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ć wartość NDEBUG.
 
:Można łatwo pozbyć się asercji, 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ć wartość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===
:Makro nie zwraca żadnej wartości.
:1 w razie powodzenia, w przeciwnym wypadku nie zwraca nic, bo program jest przerywany
 
 
===Przykład===
 
#include <assert.h>
int main()
{
int err=1;
assert(err==0);
return 0;
}
return 0;
}
 
Program wypisze:
Assertion failed: err==0, file test.c, line 6
 
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;
}
return 0;
}
 
nie pojawi się żaden komunikat o błędach.