-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

Appleの例は、これを行うことと同じです。

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

struct CGPoint違いは、Apple の定義によるコードでは、変数をORとして定義できることですCGPoint。typedef では、基本的に、CGPoint とも呼ばれる CGPoint という名前の構造体ではなく、CGPoint を呼び出す名前のない構造体を作成しました。

多くの場合、typedef の「構造体」部分が次のようなものに置き換えられていることがわかります。CGPoint_t

編集:以下を検討してください。

typedef struct {
    List *next;  // <-- compiler error
} 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言語では、構造体名(タグと呼ばれる)は独自の名前空間に存在します。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同じことです。

FooC ++のように(そして私たちの直感が教えてくれるように)ちょうど使用したい場合はFoo、そのstruct Foo型にちなんで名付けられたtypedefを作成する必要があります。これは、Appleの定義CGPointが行っていることです。

両方を1つのステートメントに組み合わせることができます。

typedef struct Foo {
   int smth;
} Foo;

これはそれらの本があなたにそれをするように忠告する方法です。

于 2013-03-17T15:46:42.327 に答える