“cname”和“name.h”中的类型可以是不同的类型吗?
Can types in `cname` and `name.h` be different types?
此代码是否符合标准?
#include <stdio.h>
#include <cstdio>
int main() {
FILE *f1 = 0;
std::FILE *f2 = f1;
}
说明:标准说[标题]:
[...]每个标题
cname
的内容应与相应标题的内容相同name.h
[...],就像包含一样。然而,在C++标准库中,声明 [...] 在命名空间std
的命名空间范围 (3.3.6( 内。未指定这些名称是否首先在全局命名空间范围内声明,然后通过显式 using 声明 (7.3.3( 注入命名空间std
。
因此,如果它们不是通过显式使用声明注入的,它们可能是不同的类型吗?我不认为"好像通过包含"短语是决定性的,因为文本的另一半显然与此要求相矛盾,要求名称位于std
命名空间内。
是的,这是符合标准的:FILE*
在 stdio.h
中声明,std::FILE*
在 cstdio
中声明,并且由于您引用的段落,两者是相同的。
(唯一未指定的是,如果您只包含 <cstdio>
,您是否在全局命名空间中也具有相同的FILE*
。
更新:我相信这些类型在鼻子上实际上是相同的,并且每个类型只声明一次,然后通过using
声明注入到另一个命名空间。 唯一未指定的是哪一个先出现。相应的相反标准报价是D.5(2(:
每个 C 标头(每个标头都有一个 name.h 形式的名称(的行为就像由相应的 cname 标头放置在标准库命名空间中的每个名称都放置在全局命名空间范围内一样。未指定这些名称是首先在命名空间 std 的命名空间范围 (3.3.6( 内声明或定义,然后通过显式 using-声明 (7.3.3( 注入全局命名空间范围。
基本上,这意味着可以有两种实现:
"C先来":
// foo.h
struct Gizmo { /* ... */ };
// cfoo
#include "foo.h"
namespace std { using ::Gizmo; }
"C++与 C 兼容:
// cfoo
namespace std
{
struct Gizmo { /* ... */ };
}
// foo.h
#include <cfoo>
using std::Gizmo;
我不相信那段说它们必须是相同的。它只是对原始(C++98(段落的修订,该段落说:
每个 C 标头(每个标头都有一个表单 name.h 的名称(的行为就好像由相应的 cname 标头放置在标准库命名空间中的每个名称也放置在命名空间
std
的命名空间范围内,后跟显式 using 声明 (7.3.3(
这介于难以理解和不可能之间,因为它与大多数系统上现有的真实 C 标头冲突。因此,在 C++11 中,文本更改为您引用的文本。它允许以相反的方式实现它,就像他们在实践中一直做的那样 - 使用现有系统提供的 C 标头并将名称导入命名空间std
。
但是,还有一段说,无论实现以何种方式执行此操作,标头中的名称都必须具有相同的含义:
对于标准 C 库中
T
的每个类型,::T
和std::T
的类型保留给实现,并且在定义时,::T
应与std::T
相同。([外部类型],17.6.4.3.4(
是的,它们可以是不同的类型。使用C++类型;C 标头只是为了兼容性。
考虑一下,如果如上面答案的注释所暗示的那样,C++标头是按namespace std { #include "stdio.h" }
实现的;那么::FILE
和std::FILE
将代表不同的类型。
- 在一个模板函数中,若输入的类型是enum类,我该如何使用std::underlying_type
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- 根据模板的基本类型创建不同的模板类
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 如何声明一个标准::提升直方图的向量?提升直方图的类型是什么?
- 类名后跟括号的类型是什么
- 函数的返回值类型是别名 ***或 *** 布尔值
- 如何在模板函数中根据对象的类型构造不同的对象?
- 实例化具有不完整类型的类模板格式不正确(如果该类型是在之后定义的)
- 哪些 C++ 数据类型是 Metal 和所有其他 C++ 平台共有的
- int* 和 int** 是不同的类型吗?C++
- 是一个被认为是不同类型的班级内部的正向声明
- 为什么推导出的乐趣(T t)和乐趣(T && t)的类型在C++中是不同的?
- 使用模板在核心类型不同的不同项目中使用通用代码,这些项目的核心类型在 c++ 中是不同的
- 在C 中按行读取文本文件,每行都是不同的数据类型
- 是其他类型的不同类型的初始化衍生物,或者它们是完全分开的
- “cname”和“name.h”中的类型可以是不同的类型吗?
- 二叉树,其中数据是不同的继承类型
- 为什么非模板化函数具有相同的名称和参数但不同的返回类型是非法的?(但对模板函数合法吗?)