私は、次のように定義構造体があります。以下の構造体は同じ型ですか?
typedef struct {
string foo;
} A, B;
を次のように私はまた、関数の集合を持っている:
void Init(A *p) {
p->foo;
}
void Init(B *p) {
p->foo;
}
gccはinitが再定義されていることを訴えます。 2番目のInit関数を単に削除することはできますか? AはBと同じタイプですか?
私は、次のように定義構造体があります。以下の構造体は同じ型ですか?
typedef struct {
string foo;
} A, B;
を次のように私はまた、関数の集合を持っている:
void Init(A *p) {
p->foo;
}
void Init(B *p) {
p->foo;
}
gccはinitが再定義されていることを訴えます。 2番目のInit関数を単に削除することはできますか? AはBと同じタイプですか?
はい、AとBは、
本質的には
と同じタイプの別名です。
私はコードを使用すると、構造体自体に名前を与えれば、より明確にし、構造体へのポインタを取る関数としてInit
を定義するだろうと思う:
struct MyStruct{
string foo;
};
typedef MyStruct A, B;
void Init(MyStruct *p) {
p->foo;
}
それはしかし、ただ個人的な好みです。
なぜ「本質的に」と言いますか?非本質的なやり方では、同じ種類のエイリアスではありませんか? –
@KerrekSB:まあ、私の英語は十分ではないかもしれません。私は誤解される可能性のある用語を選びました。私が意味したのは、この構文の本質、意味は、同じタイプに代替名を提供することです。私は、異なる解釈が存在することを意味するわけではありません。 –
はい。 Bは構造体定義で定義されたAのエイリアスです
これらはどちらも同じです。 Cでは、が リンケージ目的の型の名前として扱われるため、構造的に同じであるため、 とC++では同じです。これはあなたが書いたのとほとんど同じです:
struct A { string foo; };
typedef A B;
なぜ「ほとんど」と言いますか? – Brad
@Brad標準では、 "A"は "リンケージ目的のために"タイプの名前として扱われていると言われています。私はこの制限の完全な影響がどういうものか分からないので、違いがある特定の事例を知らないとしても、私は「ほとんど」の文をヘッジする方が好きです。 –
AとBは同じもの(同じタイプです)を意味します。 'char * a'や' char a [10] ' – qwertymk
' char * a'や 'char a [10]'と同じものではありません! –
これはC++コードまたはCコードを意図していますか? –