Domanda

Come vengono fatte le asserzioni in c ++? Il codice di esempio è apprezzato.

È stato utile?

Soluzione

Le asserzioni sono un modo per verificare esplicitamente le ipotesi formulate dal tuo codice, che ti aiuta a rintracciare molti bug restringendo quali potrebbero essere i possibili problemi. In genere vengono valutati solo in uno speciale "debug" build dell'applicazione, in modo che non rallentino la versione di rilascio finale.

Supponiamo che tu abbia scritto una funzione che ha preso un puntatore come argomento. C'è una buona probabilità che il tuo codice presuma che il puntatore sia diverso da NULL, quindi perché non verificarlo esplicitamente con un'asserzione? Ecco come:

#include <assert.h>

void function(int* pointer_arg)
{
    assert(pointer_arg != NULL);

    ...
}

Una cosa importante da notare è che le espressioni che asserisci non devono mai avere effetti collaterali, dal momento che non saranno presenti nella build di rilascio. Quindi non fare mai una cosa del genere:

assert(a++ == 5);

Ad alcune persone piace anche aggiungere piccoli messaggi nelle loro affermazioni per aiutare a dare loro un significato. Poiché una stringa eva sempre su true, è possibile scrivere questo:

assert((a == 5) && "a has the wrong value!!");

Altri suggerimenti

Le asserzioni sono espressioni booleane che in genere dovrebbero essere sempre vere.

Vengono utilizzati per garantire che ciò che ti aspetti sia anche ciò che accade.

void some_function(int age)
{
     assert(age > 0);
}

Hai scritto la funzione per affrontare le età, inoltre 'sai' di sicuro che stai sempre passando argomenti sensibili, quindi usi un'affermazione. È come dire " so che questo non può mai andare storto, ma se lo fa, voglio sapere " perché, beh, tutti commettono errori.

Quindi non è per verificare l'input dell'utente sensato, se ci sono scenari in cui qualcosa può andare storto, non usare un'asserzione. Effettua controlli reali e gestisci gli errori.

Gli asserti sono in genere solo per build di debug, quindi non inserire codice con effetti collaterali negli assert.

Le asserzioni vengono utilizzate per verificare le assunzioni di progettazione, generalmente in termini di parametri di input e risultati di ritorno. Ad esempio

// Given customer and product details for a sale, generate an invoice

Invoice ProcessOrder(Customer Cust,Product Prod)
{
  assert(IsValid(Cust));
  assert(IsValid(Prod);
'
'
'
  assert(IsValid(RetInvoice))
   return(RetInvoice);

}

Le istruzioni assert non sono necessarie per l'esecuzione del codice, ma controllano la validità dell'input e dell'output. Se l'input non è valido, c'è un bug nella funzione chiamante. Se l'input è valido e l'output non è valido, c'è un bug in questo codice. Vedi design per contratto per maggiori dettagli su questo uso di assert.

Modifica: come sottolineato in altri post, l'implementazione predefinita di assert non è inclusa nel runtime di rilascio. Una pratica comune che molti userebbero, incluso me stesso, è quella di sostituirla con una versione inclusa nella build di rilascio, ma che viene chiamata solo in modalità diagnostica. Ciò consente il corretto test di regressione su build di rilascio con controllo completo delle asserzioni. La mia versione è la seguente;

extern  void _my_assert(void *, void *, unsigned);

#define myassert(exp)                               \
{                                                   \
    if (InDiagnostics)                              \
        if ( !(exp) )                               \
            _my_assert(#exp, __FILE__, __LINE__);   \
}                                                   \

In questa tecnica è presente un piccolo sovraccarico di runtime, ma semplifica il rilevamento di eventuali bug che lo hanno reso sul campo.

Utilizza le asserzioni per verificare che " non possa accadere " situazioni.

Uso tipico: verifica gli argomenti non validi / impossibili nella parte superiore di una funzione.

Di rado visto, ma comunque utile: invarianti e postcondizioni in loop.

Le asserzioni sono dichiarazioni che ti consentono di testare tutte le ipotesi che potresti avere nel tuo programma. Ciò è particolarmente utile per documentare la logica del programma (precondizioni e postcondizioni). Le asserzioni che falliscono di solito generano errori di runtime e sono segni che qualcosa è MOLTO sbagliato nel tuo programma - la tua asserzione non è riuscita perché qualcosa che hai ritenuto vero non lo era. Le solite ragioni sono: c'è un difetto nella logica della tua funzione, o il chiamante della tua funzione ti ha passato dati errati.

Un'asserzione è qualcosa che aggiungi al tuo programma che provoca l'arresto immediato del programma se viene soddisfatta una condizione e visualizza un messaggio di errore. Di solito li usi per cose che ritieni non possano mai accadere nel tuo codice.

Questo non riguarda la struttura assert che ci è arrivata fin dai primi giorni del C, ma dovresti anche essere a conoscenza di Boost StaticAssert , nel caso in cui i tuoi progetti possano utilizzare Boost.

L'asserzione C / C ++ standard funziona durante il runtime. La funzione Boost StaticAssert ti consente di formulare alcune classi di asserzioni in fase di compilazione, rilevando errori logici e simili anche prima.

Ecco una definizione di cosa sia un'asserzione e qui è un codice di esempio. In breve, un'asserzione è un modo per uno sviluppatore di testare le sue assunzioni sullo stato del codice in un dato punto. Ad esempio, se stavi facendo il seguente codice:

mypointer->myfunct();

Probabilmente vuoi affermare che il mypointer non è NULL perché è questa la tua ipotesi - che il mypointer non sarà mai NULL prima della chiamata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top