Jeśli chodzi o analizę dyrektyw preprocesora, standard C99 (i poprzedni standard C89) jasno określał sekwencję operacji wykonywanych logicznie przez kompilator. W szczególności uważam, że oznacza to, że ten kod:
/* */ # /* */ include /* */ <stdio.h> /* */
jest równa:
#include <stdio.h>
Na dobre lub na złe, GCC 3.4.4 z „-std = c89 -pedantic” akceptuje przynajmniej wiersz z komentarzami. Nie zalecam tego jako stylu - ani przez sekundę (to jest okropne). Po prostu myślę, że jest to możliwe.
ISO / IEC 9899: 1999 sekcja 5.1.1.2 Fazy tłumaczenia mówi:
[Mapowanie znaków, w tym trygrafy]
[Łączenie wierszy - usuwanie odwrotnego ukośnika nowej linii]
Plik źródłowy jest rozkładany na tokeny przetwarzania wstępnego i sekwencje białych znaków (w tym komentarze). Plik źródłowy nie może kończyć się częściowym znacznikiem wstępnego przetwarzania ani częściowym komentarzem. Każdy komentarz jest zastępowany jednym znakiem spacji. Znaki nowego wiersza są zachowywane. To, czy każda niepusta sekwencja znaków odstępu inna niż nowy wiersz jest zachowywana lub zastępowana przez jeden znak spacji, jest zdefiniowana w ramach implementacji.
Dyrektywy przetwarzania wstępnego są wykonywane, wywołania makr są rozwijane, [...]
Sekcja 6.10 Dyrektywy dotyczące wstępnego przetwarzania mówi:
Dyrektywa preprocessing składa się z sekwencji tokenów przetwarzania wstępnego, która zaczyna się od tokenu # preprocessing, który (na początku fazy tłumaczenia 4) jest albo pierwszym znakiem w pliku źródłowym (opcjonalnie po spacji niezawierającej znaków nowego wiersza) lub następuje po białym znaku zawierającym co najmniej jeden znak nowego wiersza i kończy się następnym znakiem nowego wiersza.
Jedynym możliwym sporem jest sformułowanie w nawiasach „(na początku fazy tłumaczenia 4)”, co może oznaczać, że komentarze przed hashem muszą być nieobecne, ponieważ w przeciwnym razie nie są zastępowane spacjami do końca fazy 4.
Jak zauważyli inni, preprocesory C przed standardem nie zachowywały się jednakowo na wiele sposobów, a spacje przed i w dyrektywach preprocesora były jednym z obszarów, w których różne kompilatory robiły różne rzeczy, w tym nie rozpoznawały dyrektyw preprocesora ze spacjami przed nimi .
Warto zauważyć, że usuwanie odwrotnego ukośnika-nowej linii następuje przed analizą komentarzy. W związku z tym nie należy kończyć //
komentarzy ukośnikiem odwrotnym.
#ifdef
zawierał linii w częściach, w których mam rzeczywisty kod. Zamiast tego, jeśli potrzebuję elementów warunkowych, albo wyodrębniam to funkcje, albo makra; to jest o wiele jaśniejsze w ten sposób (cóż, przynajmniej dla mnie). Idealnie byłoby, gdyby wszystkie te wyodrębnione części znajdowały się w innych plikach (nagłówkach lub warunkowo skompilowanych plikach źródłowych; zwykle „warunkiem” jest platforma, dla której jest budowany kod).Na przykład, który podałeś, może być właściwe użycie wcięć, aby było jaśniejsze, ponieważ masz tak złożoną strukturę zagnieżdżonych dyrektyw.
Osobiście uważam, że warto trzymać je bez wcięć przez większość czasu, ponieważ te dyrektywy działają niezależnie od reszty kodu. Dyrektywy, takie jak #ifdef, są obsługiwane przez preprocesor, zanim kompilator kiedykolwiek zobaczy Twój kod, więc blok kodu po dyrektywie #ifdef może nawet nie zostać skompilowany .
Utrzymywanie dyrektyw wizualnie oddzielonych od reszty kodu jest ważniejsze, gdy są one przeplatane kodem (zamiast dedykowanego bloku dyrektyw, jak w podanym przykładzie).
źródło
Typowym rozwiązaniem jest komentowanie dyrektyw, abyś mógł łatwo wiedzieć, do czego się odnoszą:
źródło
W prawie wszystkich obecnie dostępnych kompilatorach C / CPP nie jest to ograniczone. To użytkownik decyduje, w jaki sposób chcesz wyrównać kod. Życzę miłego kodowania.
źródło