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