Asserzioni
Aggiornamento: novembre 2007
Le informazioni contenute in questo argomento sono valide per:
Edition |
Visual Basic |
C# |
C++ |
Web Developer |
---|---|---|---|---|
Express |
Solo nativo |
|||
Standard |
Solo nativo |
|||
Pro e Team |
Solo nativo |
Legenda tabella:
Si applica |
|
Non applicabile |
|
Comando o comandi nascosti per impostazione predefinita. |
Un'istruzione di asserzione specifica una condizione che ci si aspetta abbia valore True in un dato punto del programma. Se tale condizione non ha valore True, l'asserzione avrà esito negativo, l'esecuzione del programma sarà interrotta e verrà visualizzata la finestra di dialogo Asserzione non riuscita.
In Visual C++ le istruzioni di asserzione sono supportate sulla base dei seguenti costrutti:
Asserzioni MFC per programmi MFC.
ATLASSERT per programmi che utilizzano ATL.
Asserzioni CRT per programmi che utilizzano la libreria di runtime del linguaggio C.
La funzione di asserzione ANSI per altri programmi C/C++.
È possibile utilizzare le asserzioni per:
Rilevare errori logici. Per ulteriori informazioni, vedere Rilevamento di errori logici.
Controllare i risultati di un'operazione. Per ulteriori informazioni, vedere Controllo dei risultati.
Verificare le condizioni di errore che avrebbero dovuto essere gestite. Per ulteriori informazioni, vedere Verifica delle condizioni di errore.
Asserzioni MFC e della libreria di runtime del linguaggio C
Quando il debugger si interrompe a causa di un'asserzione MFC o della libreria di runtime del linguaggio C, passa al punto del codice sorgente in cui si è verificata l'asserzione, se tale codice è disponibile. Il messaggio relativo all'asserzione viene visualizzato nella finestra di output oltre che nella finestra di dialogo Asserzione non riuscita. Se si desidera salvare il messaggio relativo all'asserzione per poterlo utilizzare successivamente, è possibile copiarlo dalla finestra Output in una finestra di testo. La finestra Output può contenere anche altri messaggi di errore. Esaminare questi messaggi attentamente, poiché forniscono indizi della causa dell'esito negativo dell'asserzione.
Un esteso utilizzo di asserzioni nel codice consente di rilevare numerosi errori durante lo sviluppo. Una buona regola è scrivere un'asserzione per ciascun presupposto operato. Se si presuppone che un argomento non sia NULL, ad esempio, è possibile utilizzare un'istruzione di asserzione per controllare tale presupposto.
_DEBUG
Le istruzioni di asserzione vengono compilate solo quando _DEBUG è definito. Quando _DEBUG non è definito, il compilatore gestisce le asserzioni alla stregua di istruzioni nulle. Le istruzioni di asserzione presentano pertanto un sovraccarico nullo nella versione finale del programma. È possibile utilizzarle liberamente nel codice, senza che questo influisca sulle prestazioni della versione di rilascio e senza dover utilizzare le direttive #ifdef.
Effetti secondari dell'utilizzo delle asserzioni
Quando si aggiungono asserzioni al codice, accertarsi che tali asserzioni non abbiano effetti secondari. Si consideri ad esempio la seguente asserzione:
ASSERT(nM++ > 0); // Don't do this!
Poiché l'espressione ASSERT non viene valutata nella versione di rilascio del programma, nM presenterà valori differenti nelle versioni di debug e di rilascio. In MFC è possibile utilizzare la macro VERIFY anziché ASSERT. VERIFY valuta l'espressione ma non controlla il risultato della versione di rilascio.
È necessario prestare particolare attenzione all'utilizzo di chiamate di funzione in istruzioni di asserzione, poiché la valutazione di una funzione può avere effetti secondari imprevisti.
ASSERT ( myFnctn(0)==1 ) // unsafe if myFnctn has side effects
VERIFY ( myFnctn(0)==1 ) // safe
VERIFY chiama myFnctn sia nelle versioni di debug che in quelle di rilascio e può pertanto essere utilizzato. Sarà tuttavia presente, comunque, il sovraccarico di una funzione non indispensabile nella versione di rilascio.