C++ 指向结构的指针的Typedef等价性
我得到了一个结构的实现:C++ 指向结构的指针的Typedef等价性,c++,typedef,C++,Typedef,我得到了一个结构的实现: struct NodoQ { Etype elem; NodoQ *sig; }; 下面是代码吗 typedef NodoQ *PtrNodoQ; PtrNodoQ ppio, fin; 和这个一样吗 NodoQ* ppio; NodoQ* fin; NodoQ* ppio; NodoQ* fin; 下面是代码吗 typedef NodoQ *PtrNodoQ; PtrNodoQ ppio, fin; 和这个一样吗 NodoQ* ppio; NodoQ
struct NodoQ {
Etype elem;
NodoQ *sig;
};
下面是代码吗
typedef NodoQ *PtrNodoQ;
PtrNodoQ ppio, fin;
和这个一样吗
NodoQ* ppio;
NodoQ* fin;
NodoQ* ppio;
NodoQ* fin;
下面是代码吗
typedef NodoQ *PtrNodoQ;
PtrNodoQ ppio, fin;
和这个一样吗
NodoQ* ppio;
NodoQ* fin;
NodoQ* ppio;
NodoQ* fin;
是的,这会导致ppio
和fin
的指针类型完全相同
至于你的评论 “我没有尝试,因为我的代码中到处都有第二个选项,只是不想浪费一些时间…” 您可以轻松地测试它:
void foo(PtrNodoQ p) {
}
void bar(NodoQ* p) {
foo(p);
}
及
编译所有代码都非常好,没有无效的类型转换警告或错误
此外,您还可以在(我的)中快速找到答案: typedef名称是现有类型的别名,不是新类型的声明。Typedef不能用于更改现有类型名称(包括Typedef名称)的含义。一旦声明,typedef名称只能重新声明以再次引用同一类型。Typedef名称仅在其可见的范围内有效:不同的函数或类声明可能定义具有不同含义的同名类型
如果您需要standardese,[dcl.typedef]说明: 使用
typedef
说明符声明的名称将成为typedef名称。在其声明的范围内
typedef name在语法上等同于关键字,并命名与中的标识符关联的类型
第8条所述的方式。因此,typedef名称是另一种类型的同义词。typedef名称不起作用
不要像类声明(9.1)或枚举声明那样引入新类型。[示例:之后
结构
MILES distance;
extern KLICKSP metricp;
都是正确的声明;distance
的类型是int
,metricp
的类型是“指向int
”结束
[示例]
在你的情况下,在
typedef NodoQ *PtrNodoQ;
类型
PtrNodoQ
和Node*
完全相同,从那时起可以互换使用。声明NodoQ*ppio代码>和PtrNodoQ ppio代码>是完全等效的 是的,它们是一样的。我想是的,但是为什么不问问编译器呢?我没有尝试,因为我的代码中到处都有第二个选项,只是不想浪费一些时间。。。所以当使用typedef NodoQ*PtrNodoQ时。PtrNodoQ变成了NodoQ的别名*我想这是避免使用“*”的一种方法,并且具有更好的可读性。。。谢谢Michael和MarkIt通常建议(我也同意)在大多数情况下不要使用指针typedef,因为它们会使代码更难阅读。C程序员知道,*
表示指针已经存在。它编译的事实并不表示类型相同,因为可能会应用自动转换。我更喜欢引用标准的答案。@markransem“因为可能会应用自动转换”,OP中的NodoQ
结构不以任何方式表示这种转换。但是,是的,我更喜欢另一个答案,这就是为什么我把它选为第一名:)我知道,和你一样,没有转换。我想指出的是,您提供的代码片段无法证明这一点。相关类型之间的隐式转换一直在发生。尽管如此,我也不能抱怨太多,我也没有任何证据。@Markransem可能是一个使用模板类型推断的样本,并且使用例如,可以提供比我目前建议的测试更好的证据?