ybu*_*ill 5 c++ standards-compliance standard-library language-lawyer
此代码标准是否符合要求?
#include <stdio.h>
#include <cstdio>
int main() {
FILE *f1 = 0;
std::FILE *f2 = f1;
}
Run Code Online (Sandbox Code Playgroud)
说明:标准说[header]:
[...]每个标题的内容
cname应与相应标题的内容相同name.h[...],如同包含一样.但是,在C++标准库中,声明[...]位于命名空间的命名空间范围(3.3.6)内std.未指定是否首先在全局命名空间范围内声明这些名称,然后std通过显式使用声明将其注入命名空间(7.3.3).
因此,如果它们没有通过显式使用声明注入,它们可能是不同的类型吗?我不认为"好像通过包含"这个短语是决定性的,因为文本的另一半明显与此要求相矛盾,要求名称在std命名空间内.
我不认为该段落说它们必须相同。它只是原始 (C++98) 段落的修订版,其中表示:
每个 C 标头(每个标头都有一个name.h形式的名称)的行为就好像由相应的cname标头放置在标准库名称空间中的每个名称也放置在名称空间的名称空间范围内
std,并且后跟显式的using 声明(7.3.3)
这是很难遵循的,因为它与大多数系统上现有的真实C 头文件相冲突。因此,在 C++11 中,文本已更改为您引用的文本。它允许以相反的方式实现它,就像他们在实践中一直所做的那样 - 使用现有系统提供的 C 标头并将名称导入到命名空间std。
但是,还有另一段说,无论实现方式如何,标头中的名称都必须表示相同的含义:
T对于标准 C 库中的每种类型,类型::T和std::T保留给实现,并且在定义时应::T与 相同std::T。([外部类型],17.6.4.3.4)