Ответ 1
Да, строка, содержащая только #
и пробел, явно разрешена стандартом §16 [cpp]:
Контроль линии:
# include
pp-tokens new-line# define
идентификатор замены-списка new-line# define
идентификатор lparen identifier-list opt)
new-line для замены-списка# define
идентификатор lparen... )
new-line для замены-списка# define
идентификатор lparen identifier-list, ... )
замена-list new-line# undef
идентификатор new-line# line
pp-tokens new-line# error
pp-tokens opt new-line# pragma
pp-tokens opt new-line
#
новая строка
Обратите внимание, что комментарии заменяются пробелами на этапе 3 перевода, то есть перед препроцессором.