hävda.h

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