[英]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;
是的,它產生了與ppio
和fin
完全相同的指針類型。
至於你的評論
“我沒有嘗試,因為我的代碼中到處都有第二個選項,只是不想放松一些時間......”
你可以輕松測試它:
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;
PtrNodoQ
和Node*
類型完全相同,可以從那里開始互換使用。 聲明NodoQ* ppio;
和PtrNodoQ ppio;
完全相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.