Komentarze są usuwane podczas fazy 3 tłumaczenia programu 1 : każdy komentarz jest zastępowany jedną spacją. więc komentarz /*nt*/
zdecydowanie nie jest znakiem.
Jeśli żadna z int
, main
, i
, a
lub return
są zdefiniowane jako przerób makr, analizowania program produkuje 14 znaki (nie 13):
int
main
(
)
{
i
a
=
10
;
return
0
;
}
O ile nie i
jest zdefiniowany jako typ z typedef
instrukcją, występuje błąd składniowy, ponieważ i a
nie pasuje do reguły w gramatyce C.
Dlatego nie możesz wpisywać komentarzy w nazwach zmiennych, komentarz dzieli identyfikator na 2 oddzielne tokeny. To jest prawdziwe dla dowolnej wyprzedzającym i języka C tokena 2 .
Zwróć jednak uwagę, że możesz wstawiać komentarze w nietypowych miejscach, takich jak między operatorami jednoargumentowymi a ich operandami lub między #
dyrektywą a preprocessing i jej argumentami:
#include<stdio.h>
#defineSTAT(a)-1
#ifdefSTAT
intmain(){
inta=+1;
printf("Hello ""world!\n");
returnSTAT;
}
#endif
Ale powyższa definicja makra nie definiuje makra podobnego do funkcji, ale zwykłe makro, STAT
które rozwija się do ( a ) - 1
.
Nazwy zmiennych, jak każdy inny token, można podzielić za pomocą znaków nowej linii. Znaki nowej linii to sekwencje lub \
bezpośrednio po nich następuje nowa linia. Sekwencje te są usuwane z kodu źródłowego podczas fazy 2 tłumaczenia programu. Ich głównym celem jest złamanie długich definicji makr w wielu wierszach.
Poniżej znajduje się fragment kodu 3, który generuje te same 14 tokenów:
\
i\
nt\
ma\
in()
{\
i/\
*nt\
*/a \
= 10;
r\
et\
urn\
0;}
Zwróć uwagę, jak kolorizator kodu pomijał słowa kluczowe pokrojone w plasterki i kostkę oraz komentarz :)
1) To zachowanie zostało określone w ANSI-C aka C89. Niektórzy starożytni kompilatorzy zachowywali się nieco inaczej, co skutkowało wklejaniem znaczników, ale takie osobliwości mają jedynie znaczenie historyczne.
2) Możesz prawie wstawić komentarz wewnątrz stałej łańcuchowej, wykorzystując fakt, że sąsiednie stałe łańcuchowe są konkatenowane w fazie 6 tłumaczenia programu: printf("Hello "/* my name is Luca */"world!\n");
3) Ten styl prezentacji Choinka nie jest przeznaczony do użytku w prawdziwych programach, ilustruje, jak nadużywać możliwości obsługi wejścia C. Bardziej wyszukane sztuczki wygrały Międzynarodowy konkurs na zaciemniony kod C.
cpp -traditional
, rozszerzałby się doia = 10;
.