這是否意味着在以下聲明中的foo與此聲明中的foo相同? ...
是的,沒有。我說是,因爲這兩個聲明都聲明瞭一個名爲Card
的類型的指針變量(在C++中,C也適用,它必須是struct Card
)。但它不完全相同。
第一個聲明可以引入所謂的「不透明句柄」。該結構不需要在該點完全定義。您可以將指針傳遞給它,但只有在看到完整定義之後才能訪問任何成員。
第二個聲明引入了完整類型並立即創建一個指向它的指針。這與完整結構定義出現後的第一種情況相同。
的*
符號的外觀有我困惑,因爲它鄰近似乎Card
在我們所作的發言,並foo
出現在相鄰的語句*foo
的*
鄰接關係無關緊要的。由於無論您在哪裏撰寫,它的應用都是相同的。它修改新申報的實體,而不是類型。爲了說明:
int *i, j;
將創建只有一個指針,命名爲i
,並命名爲j
一個普通整數。由於typedef
語句遵循與變量聲明相同的規則(關鍵字typedef
的應用程序只是改變了從引入新對象到引入新類型名稱的含義),因此*
的行爲是等效的。這意味着在這裏:
typedef int *i, j;
的*
再次只i
修改。我們結束了兩個別名。別名i
,它是指向int
的指針的新類型名稱,以及j
,它是int
的別名。
事實上,如下得到同樣的效果我們可以重寫它:
typedef int j, *i;
同樣,因爲*
只修改i
。
不,不。 'typedef'爲一個已經存在的類型引入了一個別名。你無法用它來定義一個類。 – skypjack
C和C++的答案是不同的 - 你在問什麼? –
@JonathanLeffler:這很有趣 - 希望你能詳細說明實際的差異,而不是縮小問題的範圍。人們在頭文件中需要使用這種類型的代碼來包含這兩種語言並不罕見,所以用兩種語言標記問題本身並不是不合理的。 –