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.