Assert.h: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica Etichette: Inserimento tag INDEX o altre direttive Modifica da mobile Modifica da web per mobile |
sistemo e semplifico |
||
(2 versioni intermedie di 2 utenti non mostrate) | |||
Riga 1:
{{Libreria_standard_C}}
{{
'''assert.h''' è il [[Direttiva di inclusione|file di intestazione]] della [[libreria standard del C]] che implementa il sistema di [[Asserzione (informatica)|asserzione]], definendo la macro <code>assert()</code>. Tale macro può essere utilizzata per verificare e controllare l'eventuale verificarsi di casi "impossibili" nel programma.
== Descrizione ==
{| class="wikitable"
|- bgcolor=#e9e9e9
! Nome || Descrizione
|-
|<
*
*
* il numero della linea in cui si è fallita l'asserzione (la macro predefinita __LINE__)
|}
L'utilità della macro <code>assert()</code> risiede nella semplicità con la quale si può verificare un'affermazione che si ritiene, in un dato contesto, banalmente ovvia: ad esempio, ricontrollare il valore di una variabile sulla quale si sono già effettuate delle verifiche. Nel codice che segue, la macro <code>assert()</code> viene utilizzata per controllare che il valore della variabile "scelta" sia effettivamente compreso nel range valido, nonostante l'uscita dal ciclo while implicitamente affermi la veridicità di questa condizione.
<syntaxhighlight lang="c" line="1">
/* Visualizzo un menù con 4 scelte numerate da 1 a 4 */
scanf("%d", &scelta);
}
while (scelta<1 || scelta>4);
/* Primo blocco di operazioni eseguite in base al valore scelto */
</syntaxhighlight>
▲ ASSET(SCELTA>=1 && SCELTA <=4);
Utilizzando <code>assert()</code>, il programmatore si accerta nuovamente che la condizione che aveva provocato l'uscita dal ciclo while sia ancora vera: in questo caso, ad esempio, verifica di non aver accidentalmente modificato il valore della variabile <code>scelta</code> all'interno del primo blocco di operazioni.
ASSERT(PTR!= NULL);▼
L'utilizzo di <code>assert()</code> dovrebbe essere limitato alla sola fase di sviluppo di un programma. Infatti, la mancanza di verifica dell'asserzione provoca l'interruzione immediata dell'applicazione fornendo scarse informazioni in merito all'errore, anche se può essere usato l'[[operatore virgola]] per aggiungere informazioni all'espressione stampata, come in <code>assert(("2+2 fa 4", 2 + 2 == 5));</code>. Inoltre, la macro non dovrebbe essere adoperata in casi in cui ci sia una seppur piccola probabilità di fallimento, ad esempio in un'[[allocazione dinamica della memoria]]:<syntaxhighlight lang="c">
int *ptr = malloc(sizeof(int) * 10);
</syntaxhighlight>
Quando il programmatore non ha più bisogno delle asserzioni, invece di eliminarle tutte manualmente può definire la costante <code>NDEBUG</code> prima di includere nel file sorgente l'header <code>assert.h</code>: in questo modo, la macro <code>assert()</code> viene espansa semplicemente in: <code>#define assert(ignore)((void) 0)</code>, eliminando quindi ogni possibile interazione con il programma. Dunque, in presenza di <code>NDEBUG</code> eventuali espressioni passate a <code>assert()</code> non verranno valutate.
== Voci correlate ==
Line 55 ⟶ 49:
* {{en}} [http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/assert.h.html assert.h] da The Open Group Base Specifications Issue 7
* {{cita web|https://www.gnu.org/software/libc/manual/html_node/Consistency-Checking.html|Consistency Checking - The GNU C Library|lingua=en}}
* {{cita web|1=http://www.cplusplus.com/reference/clibrary/cassert/|2=C Diagnostics Library|lingua=en|accesso=3 luglio 2012|dataarchivio=21 giugno 2012|urlarchivio=https://web.archive.org/web/20120621043500/http://www.cplusplus.com/reference/clibrary/cassert/|urlmorto=sì}}
* [https://web.archive.org/web/20101124224627/http://appuntilinux.mirror.garr.it/mirrors/appuntilinux/a2/a295.htm#almltitle4039 69.2 File «assert.h»] da [[Appunti di informatica libera]]
|