※ ChatGPTを利用し、要約された質問です(原文:共用体について)
共用体について
このQ&Aのポイント
共用体(union)に関するプログラムの動作についての質問です。
コンパイル、実行した結果、警告が出て思った通りに動作しません。
警告の内容と、理想的な実行結果を示し、コード修正の方法を教えて欲しいです。
こんにちは。
質問させてください。
下記のプログラムをコンパイル、実行したところ、警告が出て自分の思った通りに動作しません。
#include <iostream>
class hoge
{
public:
union
{
float _1,_2;
float _a,_b;
float ar[2];
};
hoge( float i, float j );
};
hoge::hoge( float i, float j )
: _1( i )
, _2( j )
{
}
void main()
{
hoge huga( 0,1 );
std::cout << sizeof( hoge ) << std::endl;
std::cout << huga._1 << " : " << huga._2 << std::endl;
}
警告の内容は
「warning C4608: 'hoge::_2' は既に初期化子リスト 'hoge::<unnamed-tag>::hoge::_1' 内の他の共用体メンバにより初期化されています。」
となり、このまま実行をかけると
8
1 : 1
という実行結果になってしまいます。
自分が期待した実行結果は
8
0 : 1
なのですが、どのようにUnionを使えば期待した通りに動きますでしょうか。
/*
WindowsXP 32bit Professional
Memory 2GB
CPU Core2Duo 2.44GHz
VisualStudio2005 AcademicEdition
コンパイラの警告レベル4
*/
ちなみにunionの部分を
union
{
struct
{
float _1,_2;
}
struct
{
float _a,_b;
}
float ar[2];
};
のように修正すると期待した通りに動くのですが警告レベル4のおかげで
「warning C4201: 非標準の拡張機能が使用されています : 無名の構造体または共用体です。」
という警告が出てしまいます。
警告レベルを下げることとpragmaで警告を抑制することはしたくないのですがどのようにコードを修正すれば期待した通りに動作しますでしょうか。
よろしくおねがいします。
お礼
ありがとうございます。 仰るとおりにコードを修正したところ警告も出ず、コンパイルすることに成功しました。 ありがとうございました。