C++ C++;源文件包含";唯一映射";?

C++ C++;源文件包含";唯一映射";?,c++,c++11,C++,C++11,在C++11标准16.2.5中: 实现应为由一个或多个非数字或数字组成的序列提供唯一映射 数字(2.11)后跟句点(.)和单个非数字。第一个字符不得为数字。这个 实现可能忽略字母大小写的区别 我一点也不明白这是什么意思 “提供唯一映射”是什么意思?从什么到什么的映射?和什么相对的独特?什么的顺序 它似乎与周围段落完全不同。在典型情况下,您在#include指令中指定的是文件名。这意味着它不必是文件名。“from what”是指令中的字符序列(h-char-sequence或q-char-sequ

在C++11标准16.2.5中:

实现应为由一个或多个非数字或数字组成的序列提供唯一映射 数字(2.11)后跟句点(.)和单个非数字。第一个字符不得为数字。这个 实现可能忽略字母大小写的区别

我一点也不明白这是什么意思

“提供唯一映射”是什么意思?从什么到什么的映射?和什么相对的独特?什么的顺序


它似乎与周围段落完全不同。

在典型情况下,您在
#include
指令中指定的是文件名。这意味着它不必是文件名。“from what”是指令中的字符序列(
h-char-sequence
q-char-sequence
)。这可以映射到同类数据的某些源(或多或少是任意的)——例如,如果一个实现想要在某种数据库中存储头,它可能会将它们映射到数据库中的记录


至于“to what”部分,它是故意含糊不清的——典型的实现使用文件名,但它几乎可以是其他任何东西,只要包含一个头可以产生正确类型的结果——上面提到的数据库记录是一种可能,但它的目的是允许预编译头之类的东西,或者甚至将标准头的“知识”构建到编译器本身,因此包含标准头可能只不过是在编译器中设置一个标志,告诉它知道该头的内容。

我不认为这是一个非序列,“序列”指
对之间或
对之间的q字符序列或h字符序列

措辞(仅稍作修改)直接来自C标准,该标准在6.4.7中有此附加措辞:

这两种形式的头名称序列都映射到定义的实现中 按照6.10.2中的规定,对标题或外部源文件名进行修改

在这种情况下,后面的措辞更有意义


我相信这确实意味着实现只需要支持该表单的include文件和头部。这显然并不意味着
#include
不起作用,因为措辞没有说实现不支持其他表单,还有其他措辞要求头部行为正常。

IIUC它只是说t每个文件
#include
d只能映射到单个物理文件。例如,给定
#include
和包含路径中名为
foo.h
的两个文件,可以保证在任何情况下都只能选择单个文件。@ildjarn:好的,那么句点和单个非数字是什么意思?那么“foo.h”应该映射到一个唯一的文件,但是“foo”、“foo.1”和“foo.hh”可能会下地狱?这是我对文本的解释,但我不知道它背后的原理是什么-可能是为了在区分大小写的文件系统上特别支持C标准库头?标准头被排除在外,因为这一段仅适用于
n(n | d)*.n
格式,包括句点和非数字结尾字符。我真的不知道该段落的用途。@Xeo:“stdio.h”或“iostream”之类的内容如何不符合“一个或多个非数字或数字后跟一个句点和一个非数字。第一个字符不能是数字”的条件@ JerryCoffin:我在“IoSoCH”中没有看到一个周期。也不是“CSTDIO”实际上附有D.5:“为了兼容C标准库和C Unicode TR,C++标准库提供了25个C标题”……“……”`@user1131467:从技术上讲,这可能是一个缺陷——我认为其目的可能是周期和后续非数字是可选的。