2012-01-31 11 views
3

私は、次のように定義構造体があります。以下の構造体は同じ型ですか?

typedef struct { 
    string foo; 
} A, B; 

を次のように私はまた、関数の集合を持っている:

void Init(A *p) { 
    p->foo; 
} 
void Init(B *p) { 
    p->foo; 
} 

gccはinitが再定義されていることを訴えます。 2番目のInit関数を単に削除することはできますか? AはBと同じタイプですか?

+0

AとBは同じもの(同じタイプです)を意味します。 'char * a'や' char a [10] ' – qwertymk

+8

' char * a'や 'char a [10]'と同じものではありません! –

+0

これはC++コードまたはCコードを意図していますか? –

答えて

5

はい、AとBは、 本質的には と同じタイプの別名です。

私はコードを使用すると、構造体自体に名前を与えれば、より明確にし、構造体へのポインタを取る関数としてInitを定義するだろうと思う:

struct MyStruct{ 
    string foo; 
}; 
typedef MyStruct A, B; 

void Init(MyStruct *p) { 
    p->foo; 
} 

それはしかし、ただ個人的な好みです。

+0

なぜ「本質的に」と言いますか?非本質的なやり方では、同じ種類のエイリアスではありませんか? –

+0

@KerrekSB:まあ、私の英語は十分ではないかもしれません。私は誤解される可能性のある用語を選びました。私が意味したのは、この構文の本質、意味は、同じタイプに代替名を提供することです。私は、異なる解釈が存在することを意味するわけではありません。 –

1

はい。 Bは構造体定義で定義されたAのエイリアスです

1

これらはどちらも同じです。 Cでは、が リンケージ目的の型の名前として扱われるため、構造的に同じであるため、 とC++では同じです。これはあなたが書いたのとほとんど同じです:

struct A { string foo; }; 
typedef A B; 
+0

なぜ「ほとんど」と言いますか? – Brad

+0

@Brad標準では、 "A"は "リンケージ目的のために"タイプの名前として扱われていると言われています。私はこの制限の完全な影響がどういうものか分からないので、違いがある特定の事例を知らないとしても、私は「ほとんど」の文をヘッジする方が好きです。 –