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?
c-preprocessor
vette982
źródło
źródło
//
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.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.
źródło
Jest to identyczne z komentowaniem bloku, z jedną ważną różnicą: zagnieżdżanie nie stanowi problemu. Rozważ ten kod:
Jeśli chcę to skomentować, mogę spróbować:
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, żebaz
wywołanie nie jest komentowane, a*/
pobaz
nim następuje błąd składniowy. Z drugiej strony:Działa, aby skomentować całość. A
#if 0
s zagnieżdżą się ze sobą, w ten sposób:Chociaż, oczywiście, może to być nieco zagmatwane i stać się problemem związanym z konserwacją, jeśli nie zostanie odpowiednio skomentowane.
źródło
foo.c:3: unterminated string or character constant
od gcc, czego używasz?Trwale komentuje ten kod, więc kompilator nigdy go nie skompiluje.
Koder może później zmienić #ifdef, aby kod został skompilowany w programie, jeśli zechce.
Dokładnie tak, jakby kod nie istniał.
źródło
Mówi ci, że autor oczywiście nigdy nie słyszał o systemie kontroli wersji. Co z kolei każe ci uciekać jak najdalej…
źródło
Chciałbym dodać do
#else
sprawy:źródło
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.
źródło
#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
: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.
źródło
Nie do końca
Pokazuje "tc: 4: 19: ostrzeżenie: brak znaku kończącego" z gcc 4.2.4
źródło
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:
Możesz zrobić coś takiego i może to mieć więcej sensu, a wszystko, co musisz zrobić, to zdefiniować DEBUG, aby zobaczyć wyniki.
źródło