2015-11-17 8 views
14

Ho diversi file di configurazione ciascuno contenente la definizione di qualche macro booleana, da impostare su 0 o 1. Quindi, nel mio codice, controllo il valore di tale macro decidere quale parte del codice attivare. Ora arriva la parte difficile: voglio essere sicuro che l'intestazione contenente la definizione della mia macro sia stata inclusa.Generazione di un errore se la macro booleana selezionata non è definita

Nell'esempio seguente, se dimentico di includere il file di intestazione contenente la definizione FOO, il compilatore stamperà "world!", Mentre mi piacerebbe invece che generasse un errore.

//in the configuration header file 
#define FOO 1 

//in a cpp file 
#if FOO //I would like this to generate an error if I forgot to include the header file 
#pragma message "Hello" 
#else 
#pragma message "world!" 
#endif 

È possibile ottenere tale comportamento? Come?

Per chiarire, io non chiedo how to generate an error if a macro is not defined, ma se è possibile trasformare la linea #if FOO in modo tale che, al tempo stesso, esso controlla il valore booleano e genera un errore se FOO non è definito.

Il punto di avere questo sarebbe che gli sviluppatori avrebbero saputo che il loro codice dovrebbe contenere

SPECIAL_MACRO(FOO) 

che, allo stesso tempo, controllare il valore booleano di PIPPO, come se fosse un #if FOO dichiarazione, e impedisce da dimenticare l'inclusione dell'intestazione che definisce FOO.

+0

Dal C++ 11 è possibile utilizzare 'static_assert' –

+2

Perché non utilizzare' # ifdef'? – Petr

+0

Possibile duplicato di [Come generare un errore e un avviso nel preprocessore C?] (Http: // stackoverflow.it/questions/2221517/how-to-generate-an-error-and-warning-in-c-preprocessore) –

risposta

19

I colleghi (ciao Hartmut, Kurt) che hanno mantenuto un ampio codice di base che è stato ampiamente configurato con #define s hanno eseguito esattamente nello stesso problema. Una semplice errata ortografia, possibilmente in un file make, potrebbe portare a errori sottili che erano difficili da rintracciare. La loro soluzione: Usa macro funzione! In

#if SOME_COND() 
// ... 
#endif 

il compilatore segnala se SOME_COND() non è definito, a differenza di un semplice SOME_COND che sarà sostituito da 0 se non definito. Mi piace perché può essere utilizzato per trasportare diversi valori senza ingombrare il codice con ulteriori #ifdef s.

+1

:-) Sono dei bravi programmatori. Quando accendi le possibilità di navigazione OEM della tua auto stai utilizzando il loro software. –

+0

Puoi mostrare un esempio di come verrà definito SOME_COND? –

+0

@DanKorn Al livello più alto conteneva altre definizioni di macro funzioni del preprocessore; in seguito, nei normali file di origine, avrebbero commentato in o out porzioni di codice o valori di variabili differenti. –

0

Penso che possa risolvere il tuo problema in una soluzione semplice e complicata. Io cambio il tuo codice come sotto e il mio codice capisce che header.h non esiste e mostra un errore per me.

#if FOO == 1 
    #pragma message "Hello" 
#elif FOO == 2 
    #pragma message "world!" 
#else 
    throw std::invalid_argument("Header didn't add to project"); 
#endif 

solo è necessario modificare il valore iniziale per Foo. perché il compilatore attiva Foo == 0 quando non trova FOO, non si dovrebbe usare il valore 0 per la propria configurazione. dovresti lasciare zero per la situazione di assenza dell'intestazione. Invece devi usare valori maggiori di zero (1, 2, 3, ...).

Foo == 0 situazione di assenza.

Foo == 1 configurazione 1.

Foo == 2 Configurazione 2.

.

.

.

+0

Scusa, penso che la mia risposta sia ripetitiva. Lo so tardi – hamed