我不能说我使用了很多typedef,但在Cocoa Touch中,它有点令人困惑。以CoreGraphics自己的CGPoint定义为例:
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
如果我要从书中看到的内容来定义,请转到:
typedef struct {
CGFloat x;
CgFloat y;
} CGPoint;
它似乎工作得非常好。那么这些正在做什么,或者这些是完全相同的呢?
答案 0 :(得分:2)
Apple的例子与此相同。
typedef struct CGPoint {
CGFloat x;
CGFloat y;
} CGPoint;
不同之处在于,在使用Apple定义的代码中,您可以将变量定义为struct CGPoint
或CGPoint
。在你的typedef中你基本上创建了一个无名结构,然后你可以调用一个CGPoint,而不是一个名为CGPoint的结构,你也称它为CGPoint。
通常,您会看到typedef将'struct'部分替换为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;
如果您没有为结构命名,则不能将自身(指针)包含为成员。
答案 1 :(得分: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 Foo
和Foo
是相同的。
如果只想使用Foo
,就像在C ++中一样(就像我们的直觉告诉我们的那样!),他们必须为Foo
类型创建一个名为struct Foo
的typedef。这就是Apple对CGPoint
的定义。
您可以将它们合并为一个语句:
typedef struct Foo {
int smth;
} Foo;
这就是这些书建议你这样做的方式。