W C / C ++
Co dzieje się z kodem umieszczonym między blokiem #if 0
/ #endif
?
#if 0
//Code goes here
#endif
Czy kod jest po prostu pomijany, a zatem nie jest wykonywany?
W C / C ++
Co dzieje się z kodem umieszczonym między blokiem #if 0
/ #endif
?
#if 0
//Code goes here
#endif
Czy kod jest po prostu pomijany, a zatem nie jest wykonywany?
Odpowiedzi:
Nie tylko nie jest wykonywany, ale nawet nie jest kompilowany.
#if
jest poleceniem preprocesora, które jest oceniane przed właściwym krokiem kompilacji. Kod wewnątrz tego bloku nie pojawia się w skompilowanym pliku binarnym.
Jest często używany do tymczasowego usuwania segmentów kodu z zamiarem ponownego ich późniejszego włączenia.
Jest to identyczne z komentowaniem bloku, z jedną ważną różnicą: zagnieżdżanie nie stanowi problemu. Rozważ ten kod:
foo();
bar(x, y); /* x must not be NULL */
baz();
Jeśli chcę to skomentować, mogę spróbować:
/*
foo();
bar(x, y); /* x must not be NULL */
baz();
*/
Bzzt. Błąd składni! Czemu? Ponieważ komentarze blokowe nie zagnieżdżają się, a więc (jak widać z podświetlania składni SO), */
po wyrazie „NULL” kończy komentarz, sprawiając, że baz
wywołanie nie jest komentowane, a */
po baz
nim następuje błąd składniowy. Z drugiej strony:
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
Działa, aby skomentować całość. A #if 0
s zagnieżdżą się ze sobą, w ten sposób:
#if 0
pre_foo();
#if 0
foo();
bar(x, y); /* x must not be NULL */
baz();
#endif
quux();
#endif
Chociaż, oczywiście, może to być nieco zagmatwane i stać się problemem związanym z konserwacją, jeśli nie zostanie odpowiednio skomentowane.
foo.c:3: unterminated string or character constant
od gcc, czego używasz?
Co dokładnie robi blok #if 0… #endif?
Mówi ci, że autor oczywiście nigdy nie słyszał o systemie kontroli wersji. Co z kolei każe ci uciekać jak najdalej…
Gdy preprocesor widzi #if, sprawdza, czy następny token ma wartość niezerową. Jeśli tak, zachowuje kod kompilatora. Jeśli tak się nie stanie, pozbywa się tego kodu, więc kompilator nigdy go nie widzi.
Jeśli ktoś powie #if 0, skutecznie komentuje kod, więc nigdy nie zostanie skompilowany. Możesz myśleć o tym tak samo, jakby umieścili / * ... * / wokół niego. To nie jest to samo, ale daje ten sam efekt.
Jeśli chcesz dokładnie zrozumieć, co się stało, często możesz spojrzeć. Wiele kompilatorów pozwoli ci zobaczyć pliki po uruchomieniu preprocesora. Na przykład w programie Visual C ++ polecenie switch / P uruchomi preprocesor i umieści wyniki w pliku .i.
#if WIN32 || __CYGWIN__
ale to działa zgodnie z oczekiwaniami.
Linie zaczynające się od a #
są dyrektywami preprocesora . #if 0 [...] #endif
bloki nie docierają do kompilatora i nie generują kodu maszynowego.
Możesz zademonstrować, co dzieje się z preprocesorem za pomocą pliku źródłowego ifdef.cxx
:
#if 0
This code will not be compiled
#else
int i = 0;
#endif
Bieganie gcc -E ifdef.cxx
pokaże ci, co zostanie skompilowane.
Możesz użyć tego mechanizmu, aby zapobiec kompilacji bloku kodu podczas cyklu rozwoju, ale prawdopodobnie nie chcesz sprawdzać go w kontroli źródła, ponieważ po prostu dodaje on cruft do twojego kodu i zmniejsza czytelność. Jeśli jest to historyczny fragment kodu, który został wykomentowany, należy go usunąć: kontrola źródła zawiera historię, prawda?
Również odpowiedź może być taka sama dla C i C ++, ale nie ma języka o nazwie C / C ++ i nie jest dobrym nawykiem odwoływanie się do takiego języka.
Nie do końca
int main(void)
{
#if 0
the apostrophe ' causes a warning
#endif
return 0;
}
Pokazuje "tc: 4: 19: ostrzeżenie: brak znaku kończącego" z gcc 4.2.4
Jest to tani sposób komentowania, ale podejrzewam, że może mieć potencjał debugowania. Na przykład załóżmy, że masz kompilację, która wyprowadza wartości do pliku. Możesz nie chcieć tego w ostatecznej wersji, więc możesz użyć #if 0 ... #endif.
Podejrzewam też, że lepszym sposobem zrobienia tego w celu debugowania byłoby:
#ifdef DEBUG
// output to file
#endif
Możesz zrobić coś takiego i może to mieć więcej sensu, a wszystko, co musisz zrobić, to zdefiniować DEBUG, aby zobaczyć wyniki.
//
lub rozpocząć sekcję od/*
i zakończyć sekcję*/
. Problem z tymi ostatnimi technikami polega na tym, że komentarze nie zagnieżdżają się, więc programista musi sprawdzić i obsłużyć każdy*/
między początkiem a końcem.