0
次のコードは合法的ですか?名前のある構造体を別の構造体に匿名構造体として埋め込む
#include <stdio.h>
typedef struct _BASE_STRUCT
{
int BaseMember;
} BASE_STRUCT, *PBASE_STRUCT;
typedef struct _DERIVED_STRUCT
{
BASE_STRUCT; // Members belonging to this struct are "embedded" here.
int DerivedMember;
} DERIVED_STRUCT, *PDERIVED_STRUCT;
//
// Above struct declaration is equivalent to the following, which I believe is valid
// in C11 (anonymous structs).
//
// typedef struct _DERIVED_STRUCT
// {
// struct
// {
// int BaseMember;
// };
// int DerivedMember;
// } DERIVED_STRUCT, *PDERIVED_STRUCT;
//
int main()
{
DERIVED_STRUCT ds;
ds.BaseMember = 10; // Can be accessed without additional indirection.
ds.DerivedMember = 20;
printf("%d\n", ds.BaseMember);
return 0;
}
Visual Studioでは、匿名の構造体に関する警告を除いて、不平を言うことはないようです。しかし、匿名の構造体を使用するコードに対しても同じ警告がありますので、まだC11準拠に更新されていないと仮定します。
では先頭にアンダースコア記号は大文字を実装のために予約されているが続くので、それは(本当に法的ではありませんつまり、コンパイラがそのようなコードを受け入れないだろうし、標準ライブラリ)。 –
@JoachimPileborg OK、その時点では無視しましょう:)。私は主に 'BASE_STRUCT'が使われる方法を指していました。 – TripShock
@dxivは構造体{}のみで、構造体が他の場所で宣言されていて、この例のように名前で参照されていない場合は無効です。 http://stackoverflow.com/questions/23527255/is-this-a-c11-anonymous-struct – arsv