void main(){
struct _A Ma;
Ma.a_int = 0;
Ma._B.b_int = 0; //エラーになります。
}
以上の場合 struct _A中の struct _Bを参照する方法はあるのでしょうか?
教えて下さい。
松枝 : Mats...@sogw.nitsuko.co.jp
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>
====================================================================
> 以上の場合 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;
というのも使えるけど。
# _(アンダーバー)で始まる名前を作るのは
#やめた方がいいと思います。
--
(株)構造計画研究所 数理技術部 斉藤 努
>構造体の中に構造体が宣言されていて、
>構造体名がない場合の参照方法がわかりません。
>-----------以下---------------
>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
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 の独自拡張にもないのかな?
ほし
Hoshi Takanori wrote:
>
> ほし@えすあーるえーです。
:
: ばっさり
:
> 上記と全く同じコードを、C++ ソースとしてコンパイルしても、
> ですか? だとすると C++ の規格に反するような気が...
MSならやりかねんなぁ、と思いつつやってみましたが、さすがにエラーとな
りました。(^^;;
Ma.b_int を参照している個所で
「error C2039: 'b_int' : '_A' のメンバではありません。」
と怒られます。
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
<略>
>
> # _(アンダーバー)で始まる名前を作るのは
> #やめた方がいいと思います。
> --
> (株)構造計画研究所 数理技術部 斉藤 努
申し訳ございませんが、なぜやめた方がいいのか教えて下さい。
別に言いがかりをつけているわけではありません。
理由を知りたいだけです。
--
ξ
□P 鳥羽貴之@電精技術部(情報)
>> 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
>>> # _(アンダーバー)で始まる名前を作るのは
>>> #やめた方がいいと思います。
Takayuki> 申し訳ございませんが、なぜやめた方がいいのか教えて下さい。
># K&R 第2版には予約 (reserved) とは書いてないですが、本文に Don't use
># と書いてありますから予約と言っていいでしょう。
C の規格では、
・`_' + 大文字 で始まるもの → すべての用途において
・`_' + `_' で始まるもの → 同上
・`_' で始まるもの → ファイルスコープの識別子において
(以下省略)
が予約された識別子となっています。
--
片山@PFU