Коментарі видаляються під час фази 3 перекладу програми 1 : кожен коментар замінюється одним пробілом. тому коментар /*nt*/
точно не є символом.
Якщо жоден з int
, main
, i
, a
або return
визначаються як попередня обробка макросів, аналіз програми виробляє 14 жетонів (не 13):
int
main
(
)
{
i
a
=
10
;
return
0
;
}
Якщо i
не визначено як тип із typedef
оператором, існує синтаксична помилка, i a
яка не відповідає правилу в граматиці C.
Отже, ви не можете писати коментарі всередині імен змінних, коментар розбиває ідентифікатор на 2 окремі маркери. Це справедливо для будь-якої попередньої обробки та маркера мови 2 .
Однак зверніть увагу, що ви можете вставляти коментарі в незвичні місця, наприклад, між одинарними операторами та їх операндом або між #
директивою та попередньої обробки та її аргументами:
#include<stdio.h>
#defineSTAT(a)-1
#ifdefSTAT
intmain(){
inta=+1;
printf("Hello ""world!\n");
returnSTAT;
}
#endif
Але наведене вище визначення макросу не визначає функціональний макрос, а звичайний макрос, STAT
який розширюється до ( a ) - 1
.
Імена змінних, як і будь-який інший маркер, можна розділити за допомогою екранованих нових рядків. Екрановані нові рядки - це послідовності або за якими \
негайно йде новий рядок. Ці послідовності видаляються з вихідного коду під час фази 2 перекладу програми. Їх основна мета - розбивати довгі визначення макросів на декілька рядків.
Нижче наведено фрагмент коду 3, який виробляє ті самі 14 лексем:
\
i\
nt\
ma\
in()
{\
i/\
*nt\
*/a \
= 10;
r\
et\
urn\
0;}
Зверніть увагу, як колоризатор коду пропустив нарізані та нарізані ключовими словами ключові слова та коментарі :)
1) Ця поведінка була вказана в ANSI-C, він же C89. Деякі стародавні компілятори мали дещо іншу поведінку, що призводило до вставки символів, але такі особливості представляють лише історичний інтерес.
2) Ви можете майже вставити коментар всередині рядкової константи, скориставшись тим, що сусідні константи рядків об'єднуються у фазі 6 перекладу програми: printf("Hello "/* my name is Luca */"world!\n");
3) Цей стиль презентації Різдвяної ялинки не призначений для використання в реальних програмах, він ілюструє, як зловживати можливостями обробки вводу C. Більш складні трюки перемогли у Міжнародному конкурсі затуманеного коду С
cpp -traditional
, він би розширився доia = 10;
.