指向struct的指针的Typedef等价

时间:2015-04-23 21:28:32

标签: c++ typedef

我得到了这个结构的实现:

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

以下是此代码,

typedef NodoQ *PtrNodoQ;
PtrNodoQ ppio, fin;

与此相同吗?

NodoQ* ppio;
NodoQ* fin;

2 个答案:

答案 0 :(得分: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-names是现有类型的别名不是新类型的声明。 Typedef不能用于更改现有类型名称的含义(包括typedef-name)。声明后,只能重新声明typedef-name以再次引用相同的类型。 Typedef名称仅在它们可见的范围内有效:不同的函数或类声明可以定义具有不同含义的同名类型。

答案 1 :(得分:3)

如果你想要标准,[dcl.typedef]说明:

  

使用typedef说明符声明的名称变为 typedef-name 。在其声明范围内,a    typedef-name 在语法上等同于关键字,并命名与标识符关联的类型   第8章中描述的方式。 typedef-name 因此是另一种类型的同义词 typedef-name 可以   不以类声明(9.1)或枚举声明的方式引入新类型。 [例如:之后

typedef int MILES, *KLICKSP;
     

结构

MILES distance;
extern KLICKSP metricp;
     

都是正确的声明; distance的类型为intmetricp的类型为“指向int的指针。” -end   例子]

在你的情况下,在

之后
typedef NodoQ *PtrNodoQ;

类型PtrNodoQNode*完全相同,可以从那里开始互换使用。声明NodoQ* ppio;PtrNodoQ ppio;完全相同。