-1

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

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

如果我要根据我在书中看到的内容来定义这一点,请去:

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

它似乎工作得很好。那么它们在做什么有区别,还是它们在做完全相同的事情?

4

2 回答 2

2

苹果的例子就是这样做的。

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

不同之处在于,在 Apple 定义的代码中,您可以将变量定义为struct CGPointOR 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;

如果您不命名您的结构,则不能将其自身(指针)包含为成员。

于 2013-03-17T15:32:01.683 回答
1

在 C 语言中,结构名称(称为tags)存在于它们自己的命名空间中。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是一回事。

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

您可以将它们组合成一个语句:

typedef struct Foo {
   int smth;
} Foo;

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

于 2013-03-17T15:46:42.327 回答