C LanguageAsserzione

introduzione

Un'affermazione è un predicato che la condizione presentata deve essere vera nel momento in cui l'asserzione viene rilevata dal software. Più comuni sono le asserzioni semplici , che vengono convalidate al momento dell'esecuzione. Tuttavia, le asserzioni statiche vengono controllate al momento della compilazione.

Sintassi

  • affermare (espressione)
  • static_assert (espressione, messaggio)
  • _Static_assert (espressione, messaggio)

Parametri

Parametro Dettagli
espressione espressione di tipo scalare.
Messaggio stringa letterale da includere nel messaggio di diagnostica.

Osservazioni

Sia assert che static_assert sono macro definite in assert.h .

La definizione di assert dipende dalla macro NDEBUG che non è definita dalla libreria standard. Se NDEBUG è definito, assert è un no-op:

#ifdef NDEBUG
#  define assert(condition) ((void) 0)
#else
#  define assert(condition) /* implementation defined */
#endif

L'opinione varia a seconda che NDEBUG debba essere sempre utilizzato per le compilation di produzione.

  • Il campo professionale sostiene che assert chiamate abort e che i messaggi di asserzione non sono utili per gli utenti finali, quindi il risultato non è utile all'utente. Se si verificano condizioni fatali per il controllo del codice di produzione, è necessario utilizzare le normali condizioni if/else e exit o quick_exit per terminare il programma. Al contrario di abort , questi permettono al programma di fare un po 'di pulizia (tramite funzioni registrate con atexit o at_quick_exit ).
  • Il campo di concentramento sostiene che le chiamate di assert non dovrebbero mai attivare il codice di produzione, ma se lo fanno, la condizione che viene controllata significa che c'è qualcosa di drammaticamente sbagliato e il programma si comporterebbe in modo peggiore se l'esecuzione dovesse continuare. Pertanto, è meglio avere le asserzioni attive nel codice di produzione perché se sparano, l'inferno si è già scatenato.
  • Un'altra opzione consiste nell'utilizzare un sistema di asserzioni home-brew che esegue sempre il controllo ma gestisce gli errori in modo diverso tra lo sviluppo (dove l' abort è appropriata) e la produzione (dove un 'errore interno imprevisto - contattare l'assistenza tecnica' potrebbe essere più appropriato).

static_assert espande in _Static_assert che è una parola chiave. La condizione viene verificata al momento della compilazione, quindi la condition deve essere un'espressione costante. Non è necessario che questo sia gestito in modo diverso tra sviluppo e produzione.

Asserzione Esempi correlati