我得到这个实施结构中:等效的typedef为指向struct
struct NodoQ {
Etype elem;
NodoQ *sig;
};
是下面这段代码,
typedef NodoQ *PtrNodoQ;
PtrNodoQ ppio, fin;
与此相同吗?
NodoQ* ppio;
NodoQ* fin;
我得到这个实施结构中:等效的typedef为指向struct
struct NodoQ {
Etype elem;
NodoQ *sig;
};
是下面这段代码,
typedef NodoQ *PtrNodoQ;
PtrNodoQ ppio, fin;
与此相同吗?
NodoQ* ppio;
NodoQ* fin;
是下面这段代码,
typedef NodoQ *PtrNodoQ; PtrNodoQ ppio, fin;
与此相同吗?
NodoQ* ppio; NodoQ* fin;
是的,它是导致完全相同的指针类型ppio
和fin
。
至于您的评论
“我没有尝试,因为我在我的代码得到了第二个选项无处不在,只是不想失去一些时间...”
您可以轻松地对其进行测试:
void foo(PtrNodoQ p) {
}
void bar(NodoQ* p) {
foo(p);
}
和
void baz() {
NodoQ n;
foo(&n);
bar(&n);
}
编译完全正常,没有无效的类型转换警告或错误。
你也可能在this excellent reference(重点煤矿)的答案很快发现:
的类型定义,名称是别名为现有类型,并且是新类型的不声明。 Typedef不能用于更改现有类型名称的含义(包括typedef名称)。一旦声明,一个typedef名称只能重新声明为再次引用相同的类型。 Typedef名称仅在它们可见的范围内有效:不同的函数或类声明可以定义具有不同含义的相同名称类型。
它编译的事实并不表示类型是相同的,因为可能会应用自动转换。我更喜欢引用标准的答案。 –
@MarkRansom _“因为可能会有自动转换被应用”_ OP的'NodoQ'结构并不以任何方式表示。但是,是的,我更喜欢其他答案,这就是为什么我已经把它作为第一:) :) –
我知道,和你一样,没有转换。我想指出的是,你提供的代码片段不能证明它。相关类型之间的隐式转换始终发生。尽管我无法抱怨太多,但我也没有任何证据。 –
如果你想要的standardese,[dcl.typedef]指出:
与
typedef
符声明的名称变成了的typedef名。内其声明的范围内,一个 的typedef名在语法上等价于方式条款8.一种的typedef名描述的关键字和名称与标识符在 关联的类型是因此代名词为另一种类型。A typedef-name确实 不是引入类声明(9.1)或枚举声明的方式新类型。 [实施例:后typedef int MILES, *KLICKSP;
的构造
MILES distance; extern KLICKSP metricp;
是正确的声明;的
distance
类型是int
和的metricp
是“指针int
”。例如]
在你的情况下,在末端
typedef NodoQ *PtrNodoQ;
类型PtrNodoQ
和Node*
是完全相同并且可以从那里交换使用。声明NodoQ* ppio;
和PtrNodoQ ppio;
完全相同。
是的,它们是一样的。 –
我这么认为,但为什么不问问编译器? –
我没有尝试,因为我在代码中到处都是第二个选项,只是不想放松一些时间...所以当使用typedef NodoQ * PtrNodoQ时,这样的 。 PtrNodoQ成为NodoQ *的一个别名我猜是避免'*'和更好的可读性的一种方法... 谢谢迈克尔和马克 – HoNgOuRu