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可能是一个使用模板类型推断的样本,并且使用例如,可以提供比我目前建议的测试更好的证据?