Tvrdit h - Assert.h
C standardní knihovna |
---|
Obecná témata |
Různé záhlaví |
tvrdit.h je hlavičkový soubor v standardní knihovna z Programovací jazyk C. který definuje C preprocesor makro tvrdit ()
.[1][2] V C ++ je také k dispozici prostřednictvím <cassert>
hlavičkový soubor.
Tvrdit
tvrdit (a! = 1);
Toto je makro, které implementuje modul runtime tvrzení, které lze použít k ověření předpokladů vytvořených programem a vytištění diagnostické zprávy, pokud je tento předpoklad nepravdivý.
Při spuštění, pokud je výraz nepravdivý (to znamená, že se rovná 0), tvrdit ()
zapíše informace o hovoru, který selhal stderr
a pak zavolat přerušit()
. Informace, na které píše stderr
zahrnuje:
- zdrojový název souboru (předdefinované makro
__SOUBOR__
) - číslo zdrojového řádku (předdefinované makro
__ČÁRA__
) - zdrojová funkce (předdefinovaný identifikátor
__func__
) (přidáno v C99 ) - text výrazu, který byl vyhodnocen na 0 [1]
Příklad výstupu programu zkompilovaného na Linuxu:
program: program.c: 5: main: Assertion `a! = 1 'failed. Abort (jádro vypsáno)
Programátoři mohou vyloučit tvrzení pouhým překompilováním programu bez změny zdrojového kódu: pokud je to makro NDEBUG
je definován před zahrnutím <assert.h>
, tvrdit ()
makro lze definovat jednoduše jako:
#define assert (ignore) ((void) 0)
a proto nemá žádný vliv na kompilační jednotku, ani na vyhodnocení jejího argumentu. Proto výrazy předány tvrdit ()
musí ne obsahovat vedlejší efekty protože k nim nedojde, když je ladění zakázáno. Například:
assert (x = gets ());
nebude číst řádek a nepřiřazovat k x, když je ladění zakázáno.
Další zpráva
Ačkoli má Microsoft vlastní makro „assert with message“, neexistuje žádná standardizovaná varianta tvrdit ()
který obsahuje chybovou zprávu. Toho lze dosáhnout pomocí a operátor čárky, který zahodí všechny předchozí hodnoty a ponechá si pouze poslední:
tvrdit(("Pět prstů!", 2 + 2 = 5));// nebo#define assertmsg (x, msg) assert (((void) msg, x))assertmsg(2 + 2 == 5, "Pět prstů!");
Přinese něco podobného jako:
program: program.c: 5: main: Assertion `(" Five fingers! ", 2 + 2 == 5) 'failed.Abort
Statické prosazování
static_assert(velikost(int) > 20, „Potřebuji obrovská celá čísla“);
C ++ 11 přidal podobné klíčové slovo static_assert
[3] který kontextově převede konstantní výraz na bool
a vytiskne zprávu (volitelné od C ++ 17[3]) v době kompilace, pokud je nepravdivá. Je možné to simulovat pomocí makra a šablon, i když to pravděpodobně není nutné, protože většina moderních překladačů C ++ tuto funkci C ++ 11 podporuje.
Tato funkce byla formálně přidána do C11 jako klíčové slovo _Static_assert
se stejným použitím a v <assert.h>
pohodlné makro static_assert
je přidáno.
Je možné simulovat statické tvrzení ve starších verzích C pomocí makra: #define static_assert (cond, str) char _temp [-! ((void) str, (cond))]
, i když výsledná chyba je záhadná. (Spustí chybu, protože C umožňuje pole nulové délky, ale nikoli záporná.) Gnulib Verze statického assertu používá sizeof a strukturu ke spuštění podobné chyby.[4]
Příklad
#zahrnout <stdio.h>#zahrnout <assert.h>int test_assert(int X){ tvrdit(X <= 4); vrátit se X;}int hlavní(){ int i; pro (i=0; i<=9; i++) { test_assert(i); printf("i =% d", i); } vrátit se 0;}
i = 0i = 1i = 2i = 3i = 4assert: assert.c: 6: test_assert: Assertion `x <= 4 'failed.
externí odkazy
- Specifikace Single UNIX, Vydání 7 od Otevřená skupina : ověřit tvrzení programu - Referenční příručka základních definic,
Reference
- ^ A b Mezinárodní standard pro programovací jazyk C (C99), ISO / IEC 9899: 1999, s. 169
- ^ [Coding Programmer Page C / C ++ Reference]. Archivovány od originál dne 30.06.2012. Citováno 2012-03-23.
- ^ A b https://en.cppreference.com/w/cpp/language/static_assert
- ^ „gnulib / lib / verify.h“. coreutils. 24. listopadu 2019.