2015-04-23 18 views
6

我得到这个实施结构中:等效的typedef为指向struct

struct NodoQ { 
    Etype elem; 
    NodoQ *sig; 
}; 

是下面这段代码,

typedef NodoQ *PtrNodoQ; 
PtrNodoQ ppio, fin; 

与此相同吗?

NodoQ* ppio; 
NodoQ* fin; 
+0

是的,它们是一样的。 –

+0

我这么认为,但为什么不问问编译器? –

+0

我没有尝试,因为我在代码中到处都是第二个选项,只是不想放松一些时间...所以当使用typedef NodoQ * PtrNodoQ时,这样的 。 PtrNodoQ成为NodoQ *的一个别名我猜是避免'*'和更好的可读性的一种方法... 谢谢迈克尔和马克 – HoNgOuRu

回答

6

是下面这段代码,

typedef NodoQ *PtrNodoQ; 
PtrNodoQ ppio, fin; 

与此相同吗?

NodoQ* ppio; 
NodoQ* fin; 

是的,它是导致完全相同的指针类型ppiofin


至于您的评论

“我没有尝试,因为我在我的代码得到了第二个选项无处不在,只是不想失去一些时间...”

您可以轻松地对其进行测试:

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名称仅在它们可见的范围内有效:不同的函数或类声明可以定义具有不同含义的相同名称类型。

+0

它编译的事实并不表示类型是相同的,因为可能会应用自动转换。我更喜欢引用标准的答案。 –

+0

@MarkRansom _“因为可能会有自动转换被应用”_ OP的'NodoQ'结构并不以任何方式表示。但是,是的,我更喜欢其他答案,这就是为什么我已经把它作为第一:) :) –

+0

我知道,和你一样,没有转换。我想指出的是,你提供的代码片段不能证明它。相关类型之间的隐式转换始终发生。尽管我无法抱怨太多,但我也没有任何证据。 –

3

如果你想要的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; 

类型PtrNodoQNode*是完全相同并且可以从那里交换使用。声明NodoQ* ppio;PtrNodoQ ppio;完全相同。