杂散#在C头文件中

bd2*_*357 2 c c-preprocessor

我正在处理一些使用 C99 编译器编译的正在运行的遗留 C 代码,我在头文件中间的空行上遇到了一个“#”(哈希符号)。我使用 -Wall、-Werrors 和 -pedantic 进行编译,但没有收到运行我的单元测试的 GCC 编译器或我的目标交叉编译器的投诉。我对语言和预处理器的 BNF 语法进行了快速的谷歌搜索,但无法弄清楚流浪 # 会发生什么。它碰巧在第 1 列,但如果我将它移到第 2 列,它仍然不会发出任何警告。我的 GCC 编译器是 gcc(Rev1,由 MSYS2 项目构建)9.1.0。

真的不是问题,只是出乎意料。

有人有任何见解吗?

Eri*_*hil 7

问题 0: “我在头文件中间的空行中遇到了一个 '#'(哈希符号)。”

C 2018 6.10.7(“空指令”)1 说:

形式的预处理指令

# 新队

没有效果。

问题 1: “它碰巧在第 1 列,但如果我将它移到第 2 列,它仍然不会抛出任何警告。”

C 2018 6.10 2表示#预处理指令的令牌

... 是源文件中的第一个字符(可选地在不包含换行符的空格之后)或紧跟在包含至少一个换行符的空格之后。

因此, a#可能出现在文件开头的空格之后或新行开头的空格之后。

请注意,空格序列在很大程度上超出了 C 的形式语法(相反,它们在必要时在文本中寻址,如上所示),并且它们包括在处理早期已被空格替换的注释。所以预处理指令也可以跟在注释之后。

  • 并且,根据 [§5.1.1.2 翻译阶段](http://port70.net/~nsz/c/c11/n1570.html#5.1.1.2),注释在阶段 3 中被空格替换并处理预处理指令在第 4 阶段,注释可以在一行上的预处理指令之前。 (2认同)