我正在处理一些使用 C99 编译器编译的正在运行的遗留 C 代码,我在头文件中间的空行上遇到了一个“#”(哈希符号)。我使用 -Wall、-Werrors 和 -pedantic 进行编译,但没有收到运行我的单元测试的 GCC 编译器或我的目标交叉编译器的投诉。我对语言和预处理器的 BNF 语法进行了快速的谷歌搜索,但无法弄清楚流浪 # 会发生什么。它碰巧在第 1 列,但如果我将它移到第 2 列,它仍然不会发出任何警告。我的 GCC 编译器是 gcc(Rev1,由 MSYS2 项目构建)9.1.0。
真的不是问题,只是出乎意料。
有人有任何见解吗?
问题 0: “我在头文件中间的空行中遇到了一个 '#'(哈希符号)。”
C 2018 6.10.7(“空指令”)1 说:
形式的预处理指令
#新队没有效果。
问题 1: “它碰巧在第 1 列,但如果我将它移到第 2 列,它仍然不会抛出任何警告。”
C 2018 6.10 2表示#预处理指令的令牌
... 是源文件中的第一个字符(可选地在不包含换行符的空格之后)或紧跟在包含至少一个换行符的空格之后。
因此, a#可能出现在文件开头的空格之后或新行开头的空格之后。
请注意,空格序列在很大程度上超出了 C 的形式语法(相反,它们在必要时在文本中寻址,如上所示),并且它们包括在处理早期已被空格替换的注释。所以预处理指令也可以跟在注释之后。