グローバル無名共用体について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
fumi

グローバル無名共用体について

#1

投稿記事 by fumi » 16年前

こんばんわ。
グローバル無名共用体についてちょっと理解できないことがあるので質問させてください。(基礎的な事なのですが…)

グローバル無名共用体は
①static指定子をつける必要がある
②非公開メンバは含めてはならない
という特徴があります。
しかし、
union{
private:
	int a;
	int b;
}c;

void main()
{	
}
のように、宣言と同時に変数を定義した場合、staic指定子をつけてない&メンバが非公開として
宣言されているにも関わらず、コンパイルエラーにはなりませんでした。
もちろん、変数を定義せず、宣言のみだった場合にはコンパイラエラーになります。↓

error C2646: 無名共用体がグローバルなスコープをもっていますが、static として宣言されていません。
error C2626: 無名共用体で private メンバ '<unnamed-tag>::a' が定義されています。 error C2626: 無名共用体で private メンバ '<unnamed-tag>::b' が定義されています。

これはどう解釈したら良いのでしょうか?(変数を同時に定義した場合はただの共用体とみなされる?)
また、そもそもグローバル無名共用体は実際にどのようなときに使われるのでしょうか?

ご教授お願いします。
環境は、VC++ 2005 EE です。

hss12

Re:グローバル無名共用体について

#2

投稿記事 by hss12 » 16年前

グローバル無名共用体は使ったことがないので申し訳ないですが

構造体もそうですが、タグ名か変数名のどちらかが省略可能なので
変数名が書いてある場合は無名共用体にならないと思います。

共用体自体私は使わないので、どんな時に使うのかは分かりませんが
グローバル無名共用体の場合、グローバル変数と同じように使用でき、
ただしメモリは共有しているってことじゃないですかね。

同時に使うことがないグローバル変数がたくさんあって
メモリがとても少なく節約したいときに使えば良いのではないでしょうか。

fumi

Re:グローバル無名共用体について

#3

投稿記事 by fumi » 16年前

hss12さん、ご回答ありがとうございます。

>グローバル無名共用体は使ったことがないので申し訳ないですが
いえいえ、意見や回答をもらえるだけでも大変ありがたいと思っています。

>変数名が書いてある場合は無名共用体にならないと思います。
やはりそういうことなのですか…
タグ名がないんだから無名じゃん!って安易に思うのは間違いということですね;

>メモリがとても少なく節約したいときに使えば良いのではないでしょうか。
なるほど…。最近のPCでプログラミングする限りメモリが少ない、という状況はあまりないですが、
組み込みやマイコン制御などでは役に立つのかもしれません。使うときが来るのかはわかりませんが、
頭の片隅に置いておきたいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る