Po co używać #if 0 do komentowania bloku?

Kod inżynierii odwrotnej i jestem trochę zbulwersowany tym stylem, ale chciałem się upewnić, że nie ma dobrego powodu do robienia tych rzeczy....

Czy to tylko ja, czy to okropny styl kodowania

if ( pwbuf ) sprintf(username,"%s",pwbuf->pw_name);
else sprintf(username,"%d",user_id);

I dlaczego zawijanie kodu nie jest przeznaczone do kompilacji w

#if 0
....
#endif

Zamiast komentarzy?


EDIT: tak jak niektórzy wyjaśnili poniżej, wynika to z możliwości flummox/**/, której nie zdawałem sobie sprawy.

Ale nadal nie rozumiem, dlaczego nie po prostu użyj narzędzi środowiska programistycznego lub makr ulubionych edytorów tekstu, aby zablokować komentowanie za pomocą "/ / "

Czy nie byłoby to o wiele prostsze i łatwiejsze do poznania, aby wizualnie pominąć?


Czy jestem po prostu niedoświadczony w C i brakuje mi powodu, dlaczego te rzeczy mogą być dobrym pomysłem -- czy nie ma usprawiedliwienia, i jestem usprawiedliwiony tym, że czuję się zirytowany tym, jak brzydki jest ten kod?

Author: Brian Tompsett - 汤莱恩, 2010-09-02

11 answers

#if 0 jest używany dość często, gdy usunięty blok zawiera block-comments

Nie powiem, że to dobra praktyka, ale widzę ją dość często.

Instrukcja single line flow-control+jest wystarczająco łatwa do zrozumienia, chociaż osobiście jej unikam (a większość wytycznych kodowania, które pracowałem, zabrania jej)

BTW, pewnie edytowałbym tytuł, żeby był nieco przydatny "po co używać # jeśli 0 zamiast blokować komentarze"

Jeśli masz po

#if 0
        silly();
        if(foo)
           bar();
        /* baz is a flumuxiation */
        baz = fib+3;
#endif

Jeśli naiwnie zastąpisz #if 0/#endif z /* */, spowoduje to zakończenie komentarza zaraz po flumuxiacji, powodując błąd składni po naciśnięciu */ w miejsce #endif powyżej..

EDIT: ostatnia uwaga, często składnia #if 0 jest używana tylko podczas tworzenia, szczególnie jeśli musisz obsługiwać wiele wersji, zależności lub platform sprzętowych. Nie jest niczym niezwykłym, że kod może być zmodyfikowany do

#ifdef _COMPILED_WITHOUT_FEATURE_BAZ_
    much_code();
#endif

Ze scentralizowanym nagłówkiem definiowanie (lub nie) setek tych stałych # define. Nie jest to najładniejsza rzecz na świecie, ale za każdym razem, gdy pracowałem nad przyzwoitym projektem, używaliśmy kombinacji przełączników runtime, stałych czasu kompilacji (this), decyzji kompilacji czasu kompilacji (po prostu używaj innych.cpp w zależności od wersji), oraz okolicznościowe rozwiązanie szablonu. Wszystko zależy od szczegółów.

[10]}podczas gdy ty jesteś deweloperem, który dopiero zaczyna działać... #if 0 jest dość powszechne, jeśli nie jesteś pewien, czy stary kod nadal ma wartość.
 36
Author: jkerian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-02 20:06:57

Komentarze są komentarzami. Opisują kod.

Kod, który jest wyłączany z kompilacji to kod, a nie komentarze. Często będą to Komentarze opisujące kod, który nie jest kompilowany, na razie/

Są to dwa różne pojęcia, a wymuszanie tej samej składni uderza mnie jako błąd.

 18
Author: Jeff Dege,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-02 21:40:43

Poza problemem nie zagnieżdżania komentarzy W Stylu C, wyłączenie bloków kodu za pomocą #if 0 ma tę zaletę, że może być zwinięte, jeśli używasz edytora obsługującego składanie kodu. Jest to również bardzo łatwe do zrobienia w dowolnym edytorze, podczas gdy wyłączenie dużych bloków kodu z komentarzami w stylu C++może być nieporęczne bez obsługi edytora/makr.

Ponadto wiele #if 0 bloków ma również else. Daje to łatwy sposób na zamianę pomiędzy dwoma implementacjami/algorytmami i jest prawdopodobnie mniej podatne na błędy niż masowe komentowanie jednej sekcji i masowe komentowanie drugiej. Jednak lepiej byłoby użyć czegoś bardziej czytelnego, takiego jak #if DEBUG w tym przypadku.

 5
Author: bta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-02 20:23:56

To całkiem idiomatyczne C. Nie widzę w tym nic złego. Nie jest to piękny kawałek kodu, ale jest łatwy do odczytania i jest jasne, co się dzieje i dlaczego, nawet bez kontekstu.

Nazwy zmiennych mogłyby być lepsze i prawdopodobnie bezpieczniejsze byłoby użycie snprintf lub strncpy.

Jeśli myślisz, że mogłoby być lepiej, jak byś wolała, żeby wyglądało?

Mogę dokonać drobnej zmiany:

char username[32];
strncpy(username, 30, (pwbuf ? pwbuf->pw_name : user_id));
username[31] = '\0';
 3
Author: Steven Schlansker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-02 19:47:11

Jeśli chodzi o blokowe komentowanie za pomocą //, jednym z powodów, dla których mogę myśleć, jest to, że jeśli sprawdzisz ten kod w swoim systemie kontroli źródła, dziennik winy pokaże ci jako ostatni edytor tych linii kodu. Chociaż prawdopodobnie chcesz, aby Komentarz został przypisany do Ciebie, w tym samym czasie sam kod jest również przypisywany do ciebie. Oczywiście, możesz wrócić i spojrzeć na poprzednie wersje, jeśli chcesz sprawdzić dziennik winy dla "prawdziwego" autora kodu, ale byłoby to zaoszczędź czas, jeśli zachowano te informacje w bieżącej wersji.

 3
Author: Aaron Klotz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-02 20:09:52

Oczywiście, każdy ma swoje zdanie na ten temat. Więc oto moje:

Ja bym nigdy nie pisał kodu jak wyżej i nie myślał o każdym, kto to zrobił. Nie mogę zliczyć, ile razy ludzie myślą, że można uciec bez aparatów, a potem zostać przez nie ugryziony.

Umieszczenie instrukcji control w tej samej linii co blok kodu jest jeszcze gorsze; brak wcięcia utrudnia zobaczenie sterowania przepływem podczas czytania. Once you ' ve been kodowanie przez kilka lat przyzwyczajasz się do szybkiego i dokładnego odczytywania i interpretacji kodu, o ile możesz polegać na pewnych wskazówkach wizualnych. Obejście tych wskazówek dla "szczególnych przypadków" oznacza, że czytelnik musi zatrzymać się i zrobić podwójne ujęcie, bez ważnego powodu.

#if (0), z drugiej strony, jest ok podczas programowania, ale powinien zostać usunięty, gdy kod będzie "stabilny" (lub przynajmniej zastąpić 0 jakąś sensowną nazwą symbolu preprocesora).

 1
Author: Oliver Charlesworth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-02 19:56:13

Woah tam! Nie przesadzaj...

Nazwałbym to niechlujniej, ponieważ bardziej niespójne odstępy niż cokolwiek innego. Miałem czas, w którym stwierdziłem, że lepiej umieścić krótkie wypowiedzi na tej samej linii, co ich jeśli, chociaż te stwierdzenia rozciągają go.

Styl inline jest lepszy dla zwięzłości pionowej... można łatwo podzielić na 4, więcej linii

if (pwbuf) 
  sprintf(username,"%s",pwbuf->pw_name); 
else 
  sprintf(username,"%d",user_id); 
[2]} osobiście nienawidzę następnego stylu, ponieważ jest tak długi, co utrudnia przeglądanie pliku.
if (pwbuf) 
{
  sprintf(username,"%s",pwbuf->pw_name); 
}
else
{ 
  sprintf(username,"%d",user_id); 
}
 0
Author: smdrager,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-02 19:49:55

Uwagi powyżej. Ale monitory są panoramiczne i w ogóle, w dzisiejszych czasach, nie mam nic przeciwko

if (pwbuf) sprintf(username,"%s",pwbuf->pw_name);
else       sprintf(username,"%d",user_id);

Zawsze wydaje się mieć zbyt dużo miejsca w poziomie, a za mało miejsca w pionie na moim ekranie!

Ponadto, jeśli blok kodu ma już dyrektywy preprocesora, nie używaj #if 0; jeśli kod ma już komentarze blokowe, nie używaj /* */. Jeśli ma już oba, albo użyj edytora, który ma ctrl+/, aby skomentować wiele linijek. Jeśli nie, jesteś wypchany., Usuń kod natychmiast!

 0
Author: Sanjay Manohar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-02 19:57:22
if ( pwbuf ) sprintf(username,"%s",pwbuf->pw_name);
else sprintf(username,"%d",user_id);
Idiomatyczne i zwięzłe. Gdyby dotykał się więcej niż 2 lub 3 razy, to bym go zamocował i dalej. Nie jest to zbyt łatwe do utrzymania, jeśli dodasz informacje o logowaniu lub inne warunki.
#if 0
....
#endif

Dobrze włączyć bloki kodu debugowania czy nie. Ponadto uniknąłby błędów kompilacji związanych z próbami zablokowania komentarzy tego typu:

/* line comment */
...
/* line comment again */

Ponieważ komentarze bloku C nie zagnieżdżają się.

 0
Author: Paul Nathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-02 20:04:15

Bardzo sporadycznie używam bardziej zwięzłego stylu, gdy wspiera symetrię kodu, a linie nie stają się zbyt długie. Weźmy następujący przykład:

if (strcmp(s, "foo") == 0)
{
    bitmap = 0x00000001UL;
    bit = 0;
}
else if (strcmp(s, "bar") == 0)
{
    bitmap = 0x00000002UL;
    bit = 1;
}
else if (strcmp(s, "baz") == 0)
{
    bitmap = 0x00000003UL;
    bit = 2;
}
else if (strcmp(s, "qux") == 0)
{
    bitmap = 0x00000008UL;
    bit = 3;
}
else
{
    bitmap = 0;
    bit = -1;
}

I wersja zwięzła:

if      (strcmp(s, "foo") == 0) { bitmap = 0x00000001UL; bit = 0;  }
else if (strcmp(s, "bar") == 0) { bitmap = 0x00000002UL; bit = 1;  }
else if (strcmp(s, "baz") == 0) { bitmap = 0x00000003UL; bit = 2;  }
else if (strcmp(s, "qux") == 0) { bitmap = 0x00000008UL; bit = 3;  }
else                            { bitmap = 0;            bit = -1; }

Błędy są znacznie bardziej prawdopodobne, aby wskoczyć prosto w twarz.

Zastrzeżenie: ten przykład jest wymyślony, jak powiedziałem. Zapraszam do omówienia wykorzystania strcmp, magicznych liczb i czy podejście oparte na tabeli byłoby lepsze. ;)

 0
Author: Secure,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-03 06:54:27

#if 0 ... #endif jest dość powszechne w starszym kodzie C. Powodem jest to, że komentowanie komentarzami w stylu C /* .... */ nie działa, ponieważ komentarze nie zagnieżdżają się.

Chociaż jest to powszechne, powiedziałbym, że nie ma miejsca w nowoczesnym kodzie. Ludzie robili to w dawnych czasach, ponieważ ich edytory tekstu nie mogły automatycznie blokować dużych sekcji komentarzy. Co bardziej istotne, nie mieli odpowiedniej kontroli kodu źródłowego, tak jak my teraz. Nie ma usprawiedliwienia dla pozostawienia komentarza lub #ifdef ' D w kodzie produkcyjnym.

 -1
Author: JeremyP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-03 11:00:11