C 头文件中的杂散 #
Stray # in C header
我正在处理一些使用 C99 编译器编译的 运行 遗留 C 代码,我在头文件中间的空行中遇到了“#”(井号)。我使用 -Wall、-Werrors 和 -pedantic 进行编译,但没有收到运行我的单元测试的 GCC 编译器或我的目标交叉编译器的投诉。我对语言和预处理器的 BNF 语法进行了快速 google 搜索,但无法弄清楚对于杂散的 # 应该发生什么。它恰好在第 1 列,但如果我将它移到第 2 列,它仍然不会发出任何警告。
我的 GCC 编译器是 gcc (Rev1, Built by MSYS2 project) 9.1.0.
真的不是问题,只是出乎意料。
有人有任何见解吗?
问题 0:“我在头文件中间的空行中遇到了‘#’(井号)。”
C 2018 6.10.7(“空指令”)1 表示:
A preprocessing directive of the form
#
new-line
has no effect.
问题 1:“它恰好在第 1 列,但如果我将它移到第 2 列,它仍然不会发出任何警告。”
C 2018 6.10 2 表示预处理指令的 #
标记
… is either the first character in the source file (optionally after white space containing no new-line characters) or that follows white space containing at least one new-line character.
因此,#
可能会出现在文件开头的白色 space 之后或新行开头的白色 space 之后。
请注意,white space 的序列主要在 C 的正式语法之外(相反,它们在必要时在文本中解决,如上所示),并且它们包含已被替换的注释spaces 提前处理。所以预处理指令也可以跟在注释之后。
我正在处理一些使用 C99 编译器编译的 运行 遗留 C 代码,我在头文件中间的空行中遇到了“#”(井号)。我使用 -Wall、-Werrors 和 -pedantic 进行编译,但没有收到运行我的单元测试的 GCC 编译器或我的目标交叉编译器的投诉。我对语言和预处理器的 BNF 语法进行了快速 google 搜索,但无法弄清楚对于杂散的 # 应该发生什么。它恰好在第 1 列,但如果我将它移到第 2 列,它仍然不会发出任何警告。 我的 GCC 编译器是 gcc (Rev1, Built by MSYS2 project) 9.1.0.
真的不是问题,只是出乎意料。
有人有任何见解吗?
问题 0:“我在头文件中间的空行中遇到了‘#’(井号)。”
C 2018 6.10.7(“空指令”)1 表示:
A preprocessing directive of the form
#
new-linehas no effect.
问题 1:“它恰好在第 1 列,但如果我将它移到第 2 列,它仍然不会发出任何警告。”
C 2018 6.10 2 表示预处理指令的 #
标记
… is either the first character in the source file (optionally after white space containing no new-line characters) or that follows white space containing at least one new-line character.
因此,#
可能会出现在文件开头的白色 space 之后或新行开头的白色 space 之后。
请注意,white space 的序列主要在 C 的正式语法之外(相反,它们在必要时在文本中解决,如上所示),并且它们包含已被替换的注释spaces 提前处理。所以预处理指令也可以跟在注释之后。