Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[Q]構造体の中の構造体

451 views
Skip to first unread message

Satoshi Matsueda

unread,
Jul 2, 1998, 3:00:00 AM7/2/98
to

松枝と申します。
構造体の中に構造体が宣言されていて、
構造体名がない場合の参照方法がわかりません。
-----------以下---------------
struct _A{
int a_int;
struct _B{
int b_int;
}; // 構造体名がない
};

void main(){
struct _A Ma;
Ma.a_int = 0;
Ma._B.b_int = 0; //エラーになります。
}

以上の場合 struct _A中の struct _Bを参照する方法はあるのでしょうか?
教えて下さい。

松枝 : Mats...@sogw.nitsuko.co.jp


Ishii, Masahiko

unread,
Jul 2, 1998, 3:00:00 AM7/2/98
to

石井@広島と申します。

Satoshi Matsueda wrote:
>
> struct _A{
> int a_int;
> struct _B{
> int b_int;
> }; // 構造体名がない
> };
>
> void main(){
> struct _A Ma;
> Ma.a_int = 0;
> Ma._B.b_int = 0; //エラーになります。
> }

本来はアクセスできないはずです。

HP-UX 10.20 では、定義した時点で警告

warning 500: Unnamed struct/union members are ignored.

が表示されます。
SunOS 4.1.3 では、警告は表示されませんでした。

ですが、何れの場合も sizeof(Ma) が 4 となりました。ということは、_B
は完全に無視されている様子...

で、これが Microsoft VC++ だと話が違って、「無名構造体」というMS拡張
仕様があります。この場合は

Ma.b_int = 0;

でアクセスできます。

他のシステムでは...う、判りませんです、ハイ。
--
====================================================================
石井 昌彦 <mailto:is...@ryosen.hmw.mhi.co.jp>
====================================================================

Tsutomu Saito

unread,
Jul 2, 1998, 3:00:00 AM7/2/98
to

> struct _A{
> int a_int;
> struct _B{
> int b_int;
> }; // 構造体名がない
> };

> 以上の場合 struct _A中の struct _Bを参照
> する方法はあるのでしょうか?教えて下さい。

struct _A というオブジェクトの中に
struct _B の型の変数があるわけでは
ありません。
ないのは、構造体名ではなく変数です。

struct _A{
int a_int;
struct _B{
int b_int;

} b;
};
とすれば、

Ma.b.b_int = 0;
というふうに使えます。

C++だったら
_A::_B Mb;
というのも使えるけど。

# _(アンダーバー)で始まる名前を作るのは
#やめた方がいいと思います。
--
(株)構造計画研究所 数理技術部 斉藤 努

KATAYAMA Yoshio

unread,
Jul 2, 1998, 3:00:00 AM7/2/98
to

In article <6nf5ir$4ev$1...@nn-tk001.ocn.ad.jp>,
"Satoshi Matsueda" <Mats...@sogw.nitsuko.co.jp> writes:

>構造体の中に構造体が宣言されていて、
>構造体名がない場合の参照方法がわかりません。
>-----------以下---------------


>struct _A{
> int a_int;
> struct _B{
> int b_int;
> }; // 構造体名がない
>};

>以上の場合 struct _A中の struct _Bを参照する方法はあるのでしょうか?

struct _B の宣言は構造体メンバの宣言子がありませんが、ANSI C で
は、このような宣言は禁止されています。

Traditional C (K&R C) では、この様な制限は規定されていませんでし
たが、この場合、元の宣言は、

struct _A { int a_int; };
struct _B { int b_int; };

と等価です。したがって、「struct _A中の struct _B」自体が存在し
ませんので、それを参照する方法もありません。
--
片山@PFU

Hoshi Takanori

unread,
Jul 3, 1998, 3:00:00 AM7/3/98
to

ほし@えすあーるえーです。

In article <359B2A50...@ryosen.hmw.mhi.co.jp>
"Ishii, Masahiko" <is...@ryosen.hmw.mhi.co.jp> writes:

> > struct _A{
> > int a_int;
> > struct _B{
> > int b_int;
> > }; // 構造体名がない
> > };

C++ だと、_A::_B という型の宣言になりますね。

> で、これが Microsoft VC++ だと話が違って、「無名構造体」というMS拡張
> 仕様があります。

上記と全く同じコードを、C++ ソースとしてコンパイルしても、
ですか? だとすると C++ の規格に反するような気が...
(_B がない場合なら納得しますが。)

C++ の規格には anonymous union はあっても anonymous struct
は見当たりませんね。gcc の独自拡張にもないのかな?

ほし

Ishii, Masahiko

unread,
Jul 3, 1998, 3:00:00 AM7/3/98
to

石井@広島です。

Hoshi Takanori wrote:
>
> ほし@えすあーるえーです。
:
: ばっさり
:


> 上記と全く同じコードを、C++ ソースとしてコンパイルしても、
> ですか? だとすると C++ の規格に反するような気が...

MSならやりかねんなぁ、と思いつつやってみましたが、さすがにエラーとな
りました。(^^;;
Ma.b_int を参照している個所で

「error C2039: 'b_int' : '_A' のメンバではありません。」

と怒られます。

Kei Kashiwabara

unread,
Jul 4, 1998, 3:00:00 AM7/4/98
to

Hoshi Takanori wrote in message ...


>ほし@えすあーるえーです。
>
>In article <359B2A50...@ryosen.hmw.mhi.co.jp>
> "Ishii, Masahiko" <is...@ryosen.hmw.mhi.co.jp> writes:
>
>> > struct _A{
>> > int a_int;
>> > struct _B{
>> > int b_int;
>> > }; // 構造体名がない
>> > };
>

struct A
{
int nA;
struct B{
//......
};
B m_b;
//(or B* m_pB; で、コンストラクタで、m_pB=new B;)
};

Nested class(struct)ではインスタンスが必要になります。

---kei

Takayuki Toba

unread,
Jul 7, 1998, 3:00:00 AM7/7/98
to
Tsutomu Saito wrote:

<略>


>
> # _(アンダーバー)で始まる名前を作るのは
> #やめた方がいいと思います。
> --
> (株)構造計画研究所 数理技術部 斉藤 努

申し訳ございませんが、なぜやめた方がいいのか教えて下さい。

別に言いがかりをつけているわけではありません。
理由を知りたいだけです。

--
ξ
□P 鳥羽貴之@電精技術部(情報)

Yutaka OIWA

unread,
Jul 7, 1998, 3:00:00 AM7/7/98
to
おおいわ@東大理情です。

>> On Tue, 07 Jul 1998 18:28:30 +0900, Takayuki Toba <tob...@ise.shinko-elec.co.jp> said:

Takayuki> Tsutomu Saito wrote:
Takayuki> <略>


>>
>> # _(アンダーバー)で始まる名前を作るのは
>> #やめた方がいいと思います。
>> --
>> (株)構造計画研究所 数理技術部 斉藤 努

Takayuki> 申し訳ございませんが、なぜやめた方がいいのか教えて下さい。

__ を含む識別子は C++ の実装と標準ライブラリで、
_ で始まる識別子は C の実装で予約されています。

# と ARM に書いてある。

# K&R 第2版には予約 (reserved) とは書いてないですが、本文に Don't use
# と書いてありますから予約と言っていいでしょう。

--
大岩 寛 Yutaka Oiwa <oi...@is.s.u-tokyo.ac.jp>
東京大学理学部情報科学科 <yut...@oiwa.shibuya.tokyo.jp>
<oi...@tka.att.ne.jp>
PGP fingerprint = C9 8D 5C B8 86 ED D8 07 EA 59 34 D8 F4 65 53 61

KATAYAMA Yoshio

unread,
Jul 8, 1998, 3:00:00 AM7/8/98
to
In article <vfir9zx7u...@ise11.is.s.u-tokyo.ac.jp>,
oi...@is.s.u-tokyo.ac.jp (Yutaka OIWA) writes:

>>> # _(アンダーバー)で始まる名前を作るのは
>>> #やめた方がいいと思います。

Takayuki> 申し訳ございませんが、なぜやめた方がいいのか教えて下さい。

># K&R 第2版には予約 (reserved) とは書いてないですが、本文に Don't use
># と書いてありますから予約と言っていいでしょう。

C の規格では、

・`_' + 大文字 で始まるもの → すべての用途において
・`_' + `_' で始まるもの → 同上
・`_' で始まるもの → ファイルスコープの識別子において
(以下省略)

が予約された識別子となっています。
--
片山@PFU

Satoshi Matsueda

unread,
Jul 9, 1998, 3:00:00 AM7/9/98
to
皆さんどうも有り難うございます。
今回もいろいろと勉強になりました。
助かります。

松枝 Mats...@sogw.nitsuko.co.jp

0 new messages