2010-02-15 14 views
13

Sto cercando attraverso alcuni C del codice sorgente e non capisco la seguente partePerché qualcuno dovrebbe usare una direttiva per il preprocessore #if 1 C?

#if 1 
typedef unsigned short PronId;    /* uniquely identifies (word,pron) pair, i.e. 
            homophones have different Ids */ 
typedef unsigned short LMId; 
#define LM_NGRAM_INT 
#else 
typedef unsigned int LMId; 
typedef unsigned int PronId; 
#undef LM_NGRAM_INT 
#endif 

Perché qualcuno dovrebbe fare #if 1? Non è vero che solo il primo blocco verrà mai elaborato?

+2

'PronId'? Questo codice è per un sito web per adulti? – Thomas

+0

@Thomas Ben osservato! – Fuzz

+2

@Thomas No, è l'abbreviazione dell'ID di pronuncia in un'applicazione di riconoscimento vocale –

risposta

17

Sì, verrà elaborato solo il primo blocco, fino a quando qualcuno non cambia 1 a 0. Quindi verrà compilato l'altro blocco. Questo è un modo conveniente per passare temporaneamente blocchi di codice in entrata e in uscita durante il test di diversi algoritmi.

4

Per sperimentare vari percorsi di codice.

17

In modo che si possa scegliere rapidamente quale parte compilare cambiando lo #if 1 in #if 0.

1

È un altro modo di dire per #if true era molto probabilmente un risultato di codice che in precedenza controllava un altro simbolo e quindi refactored per essere sempre vero.

5

L'ho inserito nel mio codice quando ho bisogno di testare diversi set di parametri. Solitamente il mio prodotto verrà spedito con diverse impostazioni predefinite rispetto a quelle su cui posso lavorare in un ambiente di debug, quindi inserisco le impostazioni predefinite di spedizione in un # 1 e le impostazioni predefinite di debug in #else con un errore #per avvertire che è in fase di compilazione con debug impostazioni predefinite.

5

Una delle proprietà fondamentali del software è che il programma per computer è economico per modificare.

Ecco perché il codice è scritto in modo tale da rendere più semplice la modifica. Ecco perché hanno bisogno di vari modelli, come "interfaccia" o "proxy".

Ed è per questo che a volte vedono costrutti strane come #if 1-#else - #endif, un unico scopo è quello di passare facilmente la parte di codice che verrà compilato, dal piccolo sforzo: cambia da 1 a 0.

+0

Mi piace la citazione: "Il programma per computer è economico da modificare". – nmxprime

3

È solo un modo diverso di commentare un grande pezzo di codice, quindi l'indentazione automatica dell'editor non spezzerebbe il rientro (il blocco del codice commentato sarebbe rientrato come testo, non come codice).

1

In realtà lo utilizzo come un kludge per semplificare la piegatura del codice; se avvolgo una sezione di codice in un #if 1 ... #endif, posso piegarlo nel mio editor. (Il codice in questione è molto macro-pesante e non è stato scritto da me, quindi i metodi più tradizionali per rendere gestibile un enorme blocco di codice non funzionerà.)

0

Il modo più semplice di farlo è probabilmente fare qualcosa come :

#if ALGO1 

#else 

#endif 

Ma, si dovrà passare in ALGO1 ai args compilatore da qualche parte ... per esempio in un makefile, è necessario aggiungere -DALGO1 = 1 (se non viene fornito 1, 1 si presume) . Rif: http://www.amath.unc.edu/sysadmin/DOC4.0/c-compiler/user_guide/cc_options.doc.html

Questo è più lavoro ... quindi, di solito, per i controlli rapidi, viene utilizzato #if 1. E in alcuni casi, dimenticato e lasciato indietro anche :-)

Problemi correlati