typedef结构用法

时间:2013-03-17 15:24:42

标签: c typedef

我不能说我使用了很多typedef,但在Cocoa Touch中,它有点令人困惑。以CoreGraphics自己的CGPoint定义为例:

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

如果我要从书中看到的内容来定义,请转到:

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

它似乎工作得非常好。那么这些正在做什么,或者这些是完全相同的呢?

2 个答案:

答案 0 :(得分:2)

Apple的例子与此相同。

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

不同之处在于,在使用Apple定义的代码中,您可以将变量定义为struct CGPointCGPoint。在你的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 FooFoo是相同的。

如果只想使用Foo,就像在C ++中一样(就像我们的直觉告诉我们的那样!),他们必须为Foo类型创建一个名为struct Foo的typedef。这就是Apple对CGPoint的定义。

您可以将它们合并为一个语句:

typedef struct Foo {
   int smth;
} Foo;

这就是这些书建议你这样做的方式。