C预处理器: what is the rationale behind not allowing argument of the #include directive to begin with a digit?

标签 c include language-lawyer c-preprocessor diagnostics

N2479 C17..C2x 工作草案 - 2020 年 2 月 5 日 ISO/IEC 9899:202x (E):

6.10.2 Source file inclusion

The implementation shall provide unique mappings for sequences consisting of one or more nondigits or digits (6.4.2.1) followed by a period (.) and a single nondigit. The first character shall not be a digit.

问题:不允许 #include 指令的参数(char-sequence)以数字开头的理由是什么?

额外问题:当违反上述要求时(例如使用#include "1.h"),编译器似乎不会生成任何诊断消息。为什么?

UPD。后来我的同事回答:第一个字符不能是数字仅与唯一映射有关。因此,该标准被误解了。

最佳答案

Question: what is the rationale behind not allowing argument (char-sequence) of the #include directive to begin with a digit?

就其本身而言,“第一个字符不应是数字”这句话似乎是在说 C 程序不应使用数字作为 header 名称中的第一个字符。然而,它位于两个句子之间,告诉我们 C 实现必须如何处理 header 名称,并且位于子句 6.10 中,告诉我们实现如何处理 #include指令。告诉我们头名称语法的子句位于 C 标准 6.4.7 中的不同位置,其中给出 #include <1/a.h>作为可能的指令的示例 (C 2018 6.4.7 4)。

所以我相信 6.10.2 5 的目的是提供实现质量保证,也就是说您无法使用不支持文件名基本部分至少八个字符的文件系统直接实现 C ,但您可以使用忽略大小写(根据最后一句)或不支持以数字开头的名称的文件系统。尽管“第一个字符不能是数字”似乎是对C程序的禁止,但那是因为在没有限定条件的情况下将其单独放在一个句子中而犯了错误;前两句话应该类似于“实现应为由非数字 (6.4.2.1) 后跟零个或多个非数字或数字后跟句点 ( . ) 和单个非数字组成的序列提供唯一的映射。”

(在 C 1990 中,该段落出现在 6.8.2 中,其中重要性要求仅为 6 个字符。在 C 1999 中增加到 8 个字符,反射(reflect)了更好的文件系统的流行。)

关于C预处理器: what is the rationale behind not allowing argument of the #include directive to begin with a digit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66185385/

相关文章:

c - 是否可以将计时器值存储到变量中?

shell - rsync 排除一个目录但包含一个子目录

include - AppleScript 中的 #include like 指令

c++ - 为什么在这种情况下非类型模板参数不能是自动的?

c++ - 为什么允许某些非常量表达式作为 constexpr 逗号运算符的操作数?

C: 获取 d_name 的第一个字符

C - 为什么我的数组被覆盖了?

c++ - 通过 C ABI 通过 void 指针传递 C++ 对象(可能具有多重虚拟继承)

c++ - C11 & C++11 扩展和通用字符转义

c++ - 预编译 header 和 MSBuild