Що стосується розбору директив препроцесора, стандарт C99 (і стандарт C89 перед ним) були чіткими щодо послідовності операцій, які логічно виконував компілятор. Зокрема, я вважаю, що це означає, що цей код:
/* */ # /* */ include /* */ <stdio.h> /* */
еквівалентно:
#include <stdio.h>
На краще чи гірше, GCC 3.4.4 з '-std = c89 -pedantic' приймає лінію навантаження на коментар, у будь-якому випадку. Я не виступаю за це як стиль - ні на секунду (це примарно). Я просто думаю, що це можливо.
Розділ 5.1.1.2 ISO / IEC 9899: 1999, етапи перекладу:
[Зображення символів, включаючи триграфи]
[Спланування ліній - видалення зворотної косої лінії нового рядка]
Вихідний файл розкладається на попередню обробку лексем і послідовностей символів пробілу (включаючи коментарі). Вихідний файл не повинен закінчуватися частковим маркером попередньої обробки або частковим коментарем. Кожен коментар замінюється одним символом пробілу. Нові рядкові символи зберігаються. Чи будь-яка порожня послідовність символів пробілу, відмінних від нового рядка, збережена або замінена одним символом пробілу, визначається реалізацією.
Попередні директиви виконуються, макровикликання розгортаються, [...]
Розділ 6.10 Директиви щодо попередньої обробки:
Директива щодо попередньої обробки складається з послідовності символів попередньої обробки, що починається з маркера # попередньої обробки, який (на початку 4 етапу перекладу) або є першим символом у вихідному файлі (необов'язково після пробілу, що не містить символів нового рядка) або того слід пробіл, що містить щонайменше один символ нового рядка, і закінчується наступним символом нового рядка.
Єдиний можливий спір - це вираз у дужці «(на початку фази 4 перекладу)», що може означати, що коментарі перед хешем повинні бути відсутніми, оскільки вони інакше не замінюються пробілами до кінця фази 4.
Як зазначали інші, попередні стандартні препроцесори C не поводилися однаково в декількох напрямках, а пробіли до і в директивах препроцесора були однією з областей, де різні компілятори робили різні дії, включаючи не розпізнавання директив препроцесора з пробілами перед ними .
Примітно, що видалення зворотної косої лінії - нового рядка відбувається перед аналізом коментарів. Отже, не слід закінчувати //
коментарі зворотною косою рисою.