簡體   English   中英

指向struct的指針的Typedef等價

[英]Typedef equivalence for a pointer to 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; 

是的,它產生了與ppiofin完全相同的指針類型。


至於你的評論

“我沒有嘗試,因為我的代碼中到處都有第二個選項,只是不想放松一些時間......”

你可以輕松測試它:

void foo(PtrNodoQ p) {
}

void bar(NodoQ* p) {
    foo(p);
}

void baz() {
    NodoQ n;
    foo(&n);
    bar(&n);
}

編譯完全正常,沒有無效的類型轉換警告或錯誤。


你也可以在這個出色的參考文獻中快速找到答案(強調我的):

typedef-names是現有類型的別名不是新類型的聲明 Typedef不能用於更改現有類型名稱的含義(包括typedef-name)。 聲明后,只能重新聲明typedef-name以再次引用相同的類型。 Typedef名稱僅在它們可見的范圍內有效:不同的函數或類聲明可以定義具有不同含義的相同命名的類型。

如果你想要標准,[dcl.typedef]說明:

使用typedef說明符聲明的名稱將成為typedef-name 在其聲明的范圍內, typedef-name在語法上等同於關鍵字,並按照第8章中描述的方式命名與標識符關聯的類型。因此, typedef-name是另一種類型的同義詞 typedef-name 不會像類聲明(9.1)或枚舉聲明那樣引入新類型。 [例子:之后

 typedef int MILES, *KLICKSP; 

建築

 MILES distance; extern KLICKSP metricp; 

都是正確的聲明; distance的類型是int ,而metricp是“指向int指針” metricp 末端示例]

在你的情況下,之后

typedef NodoQ *PtrNodoQ;

PtrNodoQNode*類型完全相同,可以從那里開始互換使用。 聲明NodoQ* ppio; PtrNodoQ ppio; 完全相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM