C源包含名称长度

时间:2016-09-15 10:11:58

标签: c gcc clang

根据C标准,第6.10.2条第5款[ISO / IEC 9899:2011],

  

实现应为序列提供唯一的映射   由一个或多个非数字或数字组成(6.4.2.1),后跟一个   句点(。)和单个非数字。第一个字符不应该是   数字。实现可能会忽略字母大小写的区别   并将映射限制为八个重要字符   周期。

这意味着如果两个包含文件共有前8个字符,那么它实际选择的标题是未定义的。

当我使用clang或gcc编译时,我并没有真正面对这个问题。但是,GCC和Clang中是否存在源文件包含的文档行为?

在现代世界中,如果任何编译器确实限制为8个字符,我会觉得很奇怪。

参考:C11 WG14 draft version N1570Cert C Coding standard

1 个答案:

答案 0 :(得分:6)

  

这意味着如果两个包含文件共有前8个字符,那么它实际选择的标题是未定义的。

不,我反对这一点:看看我们看到标准使用的确切措辞:

  

[..]实施可能忽略[..]

这是“可能”,而不是“”。如果使用后者,那确实意味着行为未定义(N1570 $ 4/2)。由于“may”原样使用,没有确切的声明,我认为可以安全地假设单词的正常含义(source,强调我的):

  

用于表达机会或权限

因此,允许实现仅考虑前8个字符,但不必考虑。

有趣的是:我找不到GCC手册中“序列”的“区别限制”的确切文档,意思是(N1570 $ 4/8,强调我的)......

  

实施必须附带定义所有实施定义和特定于语言环境的特征及所有扩展的文档。

......海湾合作委员会可以(在一些非常迂腐的观点下)被视为不合格的实施。正如@PaulGriffiths指出的那样,他们手册中实际相关的部分可能是(source,列表中的第4点):

  

标识符或宏名称中的重要初始字符。

     

预处理器将所有字符视为重要字符。 C标准只要求前63个是重要的。

关于评论:

  

[..]我实际上正在尝试评估,只要我在Linux平台上使用其中一个编译器,这是否会让我感到困惑。 [..]

我真的怀疑这会(再一次)成为一个问题。