2013-03-17 114 views
-1

我不能說我已經使用了很多typedefs,但在Cocoa Touch中,這有點令人困惑。就拿CoreGraphics在自己的定義CGPoint:typedef結構用法

struct CGPoint { 
    CGFloat x; 
    CGFloat y; 
}; 
typedef struct CGPoint CGPoint; 

如果我是從我在書本上見過這個定義,去:

typedef struct { 
    CGFloat x; 
    CgFloat y; 
} CGPoint; 

,它似乎是工作完全正常。那麼這些做的有什麼不同呢,還是這些做着完全相同的事情?

+3

順便說一句,Xcode沒有定義任何東西。 Xcode是一個集成開發環境(IDE)。這些'typedef'來自MacOS X或iOS頭文件。您應該嘗試瞭解系統和您使用的工具之間的差異。 – user1118321 2013-03-17 15:30:52

+0

修正了這個問題,甚至與Xcode甚至沒有遠程關聯,當你知道它不是Xcode定義類型,編譯你的代碼並且擦除你的底部時?** – 2013-03-17 16:39:12

回答

2

蘋果的例子和做這個一樣。

typedef struct CGPoint { 
    CGFloat x; 
    CGFloat y; 
} CGPoint; 

不同的是,在與蘋果的定義代碼,你可以定義一個變量,要麼struct CGPoint OR CGPoint。在你的typedef中,你基本上創建了一個無名結構,然後調用一個CGPoint,而不是一個名爲CGPoint的結構,也稱爲CGPoint。

你經常會看到的typedef有類似CGPoint_t

編輯取代了「結構」部分:考慮下。

typedef struct { 
    List *next; // <-- compiler error 
} List; 

爲什麼?因爲編譯器尚不知道類型'List'。

typedef struct List { 
    struct List *next; // <-- works because you named your struct, and used that name here 
} List; 

如果你沒有命名你的結構,你不能包括自己(指針)作爲成員。

+0

是否有任何特定的優點typedef之前的結構? – funtime 2013-03-17 15:37:56

+1

基本上它是一個約定。當你需要命名一個結構(我知道的)時,只有一個例子,那就是結構依賴於它自己。我會更新我的答案以提供代碼。 – 2013-03-17 15:43:38

+0

啊,我明白了,謝謝!很高興看到有人願意對那裏的新手感到好極了! – user1615285 2013-03-17 19:28:05

1

在C語言中,結構名稱(稱爲標籤)住在它們自己的名稱空間中。 struct Foo名稱不同的東西比Foo

struct Foo { 
    int smth; 
}; 

int main() { 
    struct Foo foo; // OK. note `struct`, it is required 
    // Foo nope; // ERROR, no such type Foo 
} 

在C++中,struct FooFoo是一樣的。

如果想只使用Foo,就像在C++(和喜歡我們的直覺告訴我們!),他們必須創建爲struct Foo類型命名Foo的typedef。這就是蘋果公司定義的CGPoint正在做的事情。

您可以將它們結合了到一個語句:

typedef struct Foo { 
    int smth; 
} Foo; 

這是那些書怎麼勸你做到這一點。