hävda.h
C standardbibliotek (libc) |
---|
Allmänna ämnen |
Diverse rubriker |
assert.h är en rubrikfil i standardbiblioteket för programmeringsspråket C som definierar C- förprocessormakrot assert()
. I C++ är det också tillgängligt via rubrikfilen <cassert> .
Hävda
hävda ( a != 1 );
Detta är ett makro som implementerar ett körtidspåstående , som kan användas för att verifiera antaganden som gjorts av programmet och skriva ut ett diagnostiskt meddelande om detta antagande är falskt.
När det körs, om uttrycket är falskt (det vill säga jämför lika med 0), kommer assert()
att skriva information om anropet som misslyckades på stderr
och sedan anropa abort()
. Informationen den skriver till stderr
inkluderar:
- källfilnamnet (det fördefinierade makrot
__FILE__
) - källradsnumret (det fördefinierade makrot
__LINE__
) - källfunktionen (den fördefinierade identifieraren
__func__
) (tillagd i C99 ) - uttryckstexten som värderades till 0
Exempel på utdata av ett program kompilerat på Linux:
program: program.c:5: main: Påstående `a != 1' misslyckades. Avbryt (kärnan dumpad)
Programmerare kan eliminera påståendena bara genom att kompilera om programmet, utan att ändra källkoden: om makrot NDEBUG
definieras före inkluderingen av <assert.h>
, kan assert ()-
makrot enkelt definieras som:
#define assert(ignore)((void) 0)
och har därför ingen effekt på sammanställningsenheten, inte ens utvärderar dess argument. Därför får uttryck som skickas till assert()
inte innehålla biverkningar eftersom de inte kommer att inträffa när felsökning är inaktiverad. Till exempel:
hävda ( x = får ());
läser inte en rad och tilldelar inte till x när felsökning är inaktiverad.
Ytterligare meddelande
Det finns ingen standardiserad variant av assert()
som innehåller ett felmeddelande. Detta kan ändå uppnås med hjälp av en kommaoperator , som förkastar alla föregående värden och bara behåller det sista:
hävda (( "Orwellian" , 2 + 2 == 5 ));
Kommer att ge något liknande:
program: program.c:5: main: Påstående `("Orwellian", 2 + 2 == 5)' misslyckades. Avbryta
En mer bekväm syntax kan göras med ett makro, här med namnet Microsoft använder för ett liknande makro:
#define _ASSERT_EXPR(test, meddelande) assert(((void)(meddelande), test)) _ASSERT_EXPR ( 2 + 2 == 5 , "Orwellian" );
Statisk hävda
static_assert ( sizeof ( int ) > 20 , "Jag behöver enorma heltal" ) ;
C++11 lade till ett liknande nyckelord static_assert
som kontextuellt konverterar ett konstant uttryck till bool
och skriver ut ett meddelande (valfritt sedan C++17) vid kompileringstid om det är falskt. Det är möjligt att simulera detta med hjälp av ett makro och mallar, även om detta förmodligen inte är nödvändigt eftersom de flesta moderna C++-kompilatorer stöder denna C++11-funktion.
Denna funktion lades formellt till i C11 som nyckelordet _Static_assert
med identisk användning, och i <assert.h>
läggs ett bekvämlighetsmakro static_assert till.
Det är möjligt att simulera ett statiskt påstående i äldre versioner av C med hjälp av ett makro: #define static_assert(cond, str) char _temp[-!((void)str, (cond))],
även om det resulterande felet är kryptiskt. (Det utlöser ett fel eftersom C tillåter arrayer med noll längd, men inte sådana med negativ längd.) Gnulibs version av det statiska påståendet använder sizeof och en struktur för att utlösa ett liknande fel.
Exempel
0
0
#inkludera <stdio.h> #inkludera <assert.h> int main () { int i ; för ( i = ; i <= 9 ; i ++ ) { hävda ( i < 5 ); printf ( "i = %d \n " , i ); } returnera ; }
i = 0 i = 1 i = 2 i = 3 i = 4 hävda: exempel.c:10: huvud: Påståendet `i < 5' misslyckades. Avbruten
externa länkar
- The Single UNIX Specification , Version 4 från The Open Group : verifiera programpåstående – Base Definitions Reference,