2010-02-15 7 views
13

szukam przez jakiś kodu C źródłowego i nie rozumiem następującą częśćDlaczego ktoś miałby używać dyrektywy preprocesora #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 

Dlaczego ktoś miałby zrobić #if 1? Czy nie jest prawdą, że tylko pierwszy blok zostanie kiedykolwiek przetworzony?

+2

'PronId'? Czy ten kod jest przeznaczony dla witryny dla dorosłych? – Thomas

+0

@Thomas Dobrze przestrzegane! – Fuzz

+2

@Thomas Nie, to skrót od nazwy wymowy w aplikacji rozpoznawania mowy. –

Odpowiedz

17

Tak ... Tylko pierwszy blok zostanie przetworzony --- dopóki ktoś nie zmieni 1 na 0. Wtedy drugi blok zostanie skompilowany. Jest to wygodny sposób tymczasowego przełączania bloków kodu wejściowego i wyjściowego podczas testowania różnych algorytmów.

4

Do eksperymentowania z różnymi ścieżkami kodów.

17

Aby szybko wybrać kompilowaną część, zmieniając #if 1 na #if 0.

1

To jest inny sposób powiedzenia dla #if true był najprawdopodobniej wynikiem kodu, który wcześniej sprawdzał inny symbol, a następnie refaktoryzowany, aby zawsze był prawdziwy.

5

Umieściłem to w moim kodzie, gdy potrzebuję przetestować inny zestaw parametrów. Zwykle mój produkt będzie dostarczany z różnymi domyślnymi ustawieniami niż to, z czym mogę pracować w środowisku debugowania, więc ustawiam domyślne ustawienia wysyłki w #if 1 i domyślne ustawienia debugowania w #else z #warning, aby ostrzec mnie, że jest budowany z debugowaniem domyślne.

5

Jedną z podstawowych właściwości oprogramowania jest to, że program komputerowy jest tani w modyfikacji.

Dlatego niektóre kody są napisane w taki sposób, aby ułatwić ich modyfikację. Dlatego potrzebują różnych wzorów, takich jak "interfejs" lub "proxy".

I dlatego czasami zobaczyć dziwne konstrukcje jak #if 1 - #else - #endif, których jedynym celem jest łatwo przełączyć część kodu, który zostanie opracowany przez małym wysiłku: Zmiana 1 do 0.

+0

Uwielbiam cytat: 'Program komputerowy jest tani do modyfikacji' – nmxprime

3

Jest to po prostu inny sposób komentowania dużego fragmentu kodu, więc automatyczne wcięcie edytora nie złamałoby wcięcia (skomentowany blok kodu byłby wcięty jako tekst, a nie jako kod).

1

Używam go jako kludera, aby ułatwić składanie kodu; jeśli zawinę fragment kodu w #if 1 ... #endif, mogę go złożyć w moim edytorze. (Kwestionowany kod jest bardzo makro-ciężki, a nie napisany przeze mnie, więc bardziej tradycyjne sposoby tworzenia ogromnego bloku kodu nie będą działały.)

0

Czystszy sposób robienia tego prawdopodobnie robi coś takiego :

#if ALGO1 

#else 

#endif 

Ale, trzeba będzie przechodzić w ALGO1 do args kompilatora gdzieś ... na przykład w makefile, trzeba dodać -DALGO1 = 1 (jeśli nie jest 1, 1 Przyjmuje) . Ref: http://www.amath.unc.edu/sysadmin/DOC4.0/c-compiler/user_guide/cc_options.doc.html

To więcej pracy ... więc zwykle do szybkich kontroli używany jest #if 1. A w niektórych przypadkach zapomniane i pozostawione również :-)

Powiązane problemy