L'uso di macro C / C ++ come scorciatoia per la compilazione condizionale è una buona pratica?

13

Diciamo che voglio avere diversi tipi di messaggi di output nel mio codice. Uno di questi è DEBUG , che viene stampato solo quando il codice è compilato in modalità Debug.

Di solito dovrei scrivere qualcosa di simile

#ifdef DEBUG
    std::cout << "Debug message" << std::endl;
#endif

che è piuttosto ingombrante e fastidioso da usare in molti posti.

È una buona pratica definire una macro per il frammento di codice, quindi la userai in questo modo?

MSG_DEBUG("Debug message")

O c'è un altro modo più elegante di gestirlo senza macro? Sono interessato alle possibili soluzioni sia in C che in C ++, poiché sto utilizzando entrambe le lingue in diversi progetti.

    
posta Eenoku 17.09.2018 - 10:16
fonte

3 risposte

19

Certo, se stai bene con l'uso di macro, in primo luogo, definire un parametro parametrizzato piuttosto che continuare a ripetere lo stesso codice condizionale è certamente preferibile con qualsiasi misura di buona codifica.

Dovresti usare dei macro? Dal mio punto di vista dovresti, dal momento che è accettata la pratica in C, e qualsiasi soluzione senza macro richiederebbe almeno qualcosa in esecuzione anche al di fuori della modalità di debug. Il tipico programmatore C sceglierà una macro leggermente brutta in caso di sforzi di esecuzione non necessari in qualsiasi momento.

    
risposta data 17.09.2018 - 10:25
fonte
13

C'è un elemento di preferenza personale qui, ma in C ++ preferisco farlo nel file di intestazione:

#ifdef _DEBUG
    void DebugMessage(...);
#else
    inline void DebugMessage(...) {}
#endif

In modo che la funzione sia incorporata nelle build di rilascio, ma è una funzione corretta nella compilazione di debug in modo da poter avere un corretto controllo dei tipi, messaggi di errore sensibili, ecc. e la possibilità di aggiungere ulteriori funzionalità (logging forse?) più tardi .

Ovviamente, devi anche racchiudere la definizione corrispondente della funzione nel file .cpp in un blocco #ifdef _DEBUG .

    
risposta data 17.09.2018 - 16:44
fonte
2

Sicuramente, assicurati solo di non calpestare le linee guida del codice fornite dal tuo team. Assicurati che nessun altro codice nel sistema tenti di raggiungere la stessa funzionalità tramite una condizione generale if.

    
risposta data 18.09.2018 - 02:02
fonte

Leggi altre domande sui tag