2012-02-10 11 views
10

La macro C assert standard è disabilitata quando è definita la macro NDEBUG, che significa "Non eseguire il debug". Questo porta a doppi casi negativi davvero terribili come #ifndef NDEBUG //DebuggingCode #endif. Sembra che RELEASE sarebbe stata una scelta migliore di termini, ma non posso credere che il comitato standard avrebbe fatto in quel modo senza qualche ragione per farlo ...Perché NDEBUG anziché RELEASE?

+8

'NDEBUG' implica semplicemente * nessun debug *. 'RELEASE' potrebbe implicare di più. – cnicutar

+1

"Debug"/"non eseguire il debug" ha un significato per quasi tutti gli ambienti di programmazione. "Release"/"release software"/"making a release" è una conversazione completamente diversa che accade molto tempo dopo aver scelto i flag del compilatore. –

+0

'#if definito (RELEASE)' '#define NDEBUG'' # else' '#undef NDEBUG'' # endif' – pmg

risposta

5

Avere una macro RELEASE implica che il codice è pronto per la distribuzione - quando non è possibile. D'altra parte NDEBUG implica che il debug è completo, quindi pronto per il test.

Suppongo anche che dover spegnere tutto sia meglio che dover essere sicuri di aver acceso tutto. Questo è il motivo per cui la maggior parte dei SO (per esempio) ha la maggior parte delle cose accese quando molte persone non ne hanno bisogno.

Solo i miei umili pensieri.

5

La macro NDEBUG controlla come si comporta assert.

In genere non lo si usa per altro. Se lo utilizzi per altre cose, come l'output di traccia di debug extra, non hai la possibilità di creare l'applicazione senza questo codice aggiuntivo ma con le asserzioni abilitate.

Si consiglia di definire il proprio simbolo del preprocessore, ad esempio MY_TRACE, e di utilizzarlo. Inoltre, definirlo a 0 o 1 e utilizzare #if MY_TRACE. In questo modo è possibile catturare i file utilizzando il simbolo senza essere inizializzati correttamente, se si configura il compilatore per emettere un avviso quando si utilizza una variabile non inizializzata in un'espressione di preprocessore.

+1

Perché non dovrei usarlo per qualcos'altro? –

+4

Bene, se non lo usi per nient'altro che controllare 'assert', non avresti mai bisogno di scrivere '#ifndef NDEBUG'. – Lindydancer

+2

Cosa succede quando è necessario lasciare che 'assert's sia abilitato per rintracciare un raro bug difficile da riprodurre, ma non vogliono che migliaia di righe di output di debug vengano sparse dappertutto? –

3

Non posso credere che il comitato per gli standard sarebbe [scelto di utilizzare il nome NDEBUG per controllare assert()] senza qualche ragione per farlo ....

Posso solo immaginare, ma io sospetto che il pre-standard ci possa essere stato diversi nomi usati da varie implementazioni per controllare come funzionavano le macro assert, e la commissione probabilmente decise di scegliere un nome "neutro" che era alquanto improbabile che fosse usato nel codice esistente per qualche ragione non correlata . Penso che potrebbe essere stato piuttosto comune usare RELEASE come macro in un bel po 'di codice, quindi usare quel nome (o DEBUG) per controllare la macro assert() potrebbe portare a conflitti (in particolare per gli utenti che potrebbero voler controllare bene asserzioni, attivandole solo per porzioni di codice).

0

Come utente di Eiffel a lungo termine, posso dirvi che viene utilizzato in un modo diverso, quindi eseguire il debug/nodebug. Come sottolineato, l'unico effetto è disabilitare le affermazioni assert. Lo scopo di affermare è aggiungere controlli pre e post-condizionali. Si consiglia di utilizzarlo in modo intensivo e può rallentare le prestazioni del programma di un fattore 10 o più. Questo è chiamato (Poor Men's) Design by Contract.

Quando si utilizza NDEBUG, non significa in realtà che si sia terminato il debug, ma solo che questa pesante strumentazione di debug sia stata rimossa.

Il popolare Debug/Release non è, purtroppo, il caso migliore nello sviluppo pratico in cui si dispone di un modello di rilascio Alpha, Beta, Release per buone ragioni.

Nel software alfa è così buggato che lo si compila senza simboli NDEBUG e debugger. La beta è compilata con simboli set e debugger NDEBUG (e forse già con gli switch di ottimizzazione) e la versione finale viene quindi compilata con NDEBUG e l'ottimizzazione completa.