È una cattiva pratica usarli?
In caso di abuso, sì, in particolare assert
.
Un abuso dipende dalle istruzioni assert
attive. Non dovresti mai dipendere da assert
per fare qualcosa perché il codice può essere compilato con NDEBUG
definito e quindi assert
non fa nulla. Il codice di produzione viene spesso compilato con NDEBUG
definito per garantire che tali istruzioni assert
scompaiano.
A meno che non si stia scrivendo un programma one-off che non durerà per più di un giorno o due, non si dovrebbe utilizzare per convalidare l'input dell'utente. Gli utenti non si preoccupano di dove il codice non è riuscito e il messaggio che viene stampato sembra una lingua straniera per molti utenti. Non dice all'utente come correggere l'errore. È anche molto spietato, dal design. Il messaggio emesso in risposta a un errore di input dell'utente dovrebbe essere un messaggio che indica all'utente come risolvere il problema. L'azione migliore dopo il messaggio è quella di offrire all'utente un modo per correggere l'errore. Se ciò non può essere fatto e se l'unica risposta valida è quella di terminare il programma, il programma dovrebbe terminare in modo pulito. In base alla progettazione, assert
non determina uno spegnimento pulito. Chiama abort()
anziché exit()
.
Una conseguenza di abort()
su molte macchine è la produzione di un core dump. Un core dump è un grande messaggio di errore per un programmatore. Con un core dump, un programmatore può usare il debugger per vedere cosa è andato storto in grande dettaglio. Uno svantaggio di abort()
è che le cose non vengono ripulite. Abort "termina il programma senza eseguire distruttori per oggetti di durata di memorizzazione automatica o statica e senza chiamare le funzioni passate a atexit()
."
Bottom line: Va bene (e buono) utilizzare assert
per verificare errori di programmazione, ma solo in un'impostazione non di produzione. Usa qualcos'altro per verificare gli errori degli utenti.
fonte
2013-08-13 14:14:42
'static_assert' è una dichiarazione, integrata nel linguaggio principale. Non si espande in nulla perché se non riesce, la compilazione si interrompe. – jrok
@KerrekSB Ho chiesto ** tre ** domande chiare, per favore prenditi il tempo di leggerle prima di fare una supposizione – Oleksiy
Usa asserire per specificare che c'è un errore nella tua logica di programmazione e che dovrebbe essere corretto nel codice. un 'if' è usato per diramarsi tra diversi percorsi logici nel codice. Questa è una grande differenza – Default