7

无论如何要区分一个类型的原始名称和该类型的 typedef-name 吗?

例如:

class C1 {};

typedef C1 C2;

C1 和 C2 现在都命名相同的类型。在上面的代码中,是否存在过不能用 C2 替换名称 C1 引用相关类型的情况(反之亦然)?

4

5 回答 5

5

typedef 创建一个别名,它们作为类型无法区分。另一方面,有一些特定的语法结构需要真正的类型而不是 typedef-ed(构造函数/析构函数的声明/定义......),但这是一个不同的问题。作为一种类型,它们是无法区分的。

于 2013-06-21T14:05:46.787 回答
3

它们在. _typedef

于 2013-06-21T14:04:50.573 回答
2

来自完整参考

“C 允许您使用关键字 typedef 显式定义新的数据类型名称。您实际上不是在创建新的数据类型,而是为现有类型定义新名称。”

有趣的是(也许)C++1Y 将实现一个强类型的 typededef(称为opaque typedef),它的基本名称不可互换:PDF 报告

于 2013-06-21T14:12:41.743 回答
1

是的。出于 C 兼容性的原因,您可以显式添加class到 C1: class C1 foo;,但这class C2 foo;是非法的。

这样做的原因是 C 对结构和函数有单独的命名空间,所以你也可以有一个 function void C1(int)。这不会引起歧义,因为每个结构名称都必须以struct. 但是如果你 typedef'ed struct C1,那么 typedef 名称就不允许给现有函数起别名。

于 2013-06-21T14:38:28.057 回答
0

是的,有这样一种情况。您不能使用 typedef 转发声明类型。例如class C2;将无效。

除此之外,typedef 创建一个身份类型别名并且应该是完全等价的。

于 2013-06-21T14:33:36.050 回答