構造体名のstaticについて

[戻る]
やっちゃん 2002/05/16(木) 11:50:43
C/C++について質問です。

構造体を下記ように宣言しました。
これはプログラム上、許されるのでしょうか?

-------------------------------
static struct STR_TYPE {
  ・・・
}

static struct STR_TYPE a_str;

-------------------------------

構造体STR_TYPEの宣言時に記載されているstaticは、どこにかかるのでしょうか?
もしかして、a_strの宣言時にstaticを省略してもstatic宣言されるのでしょうか?

知ってみえる方、ご助言宜しくお願い致します。

dairygoods 2002/05/16(木) 12:45:36
実際にコンパイルしてみればわかると思いますが、
コンパイラはお持ちでないのでしょうか?

MSDNより:
|記憶クラス指定子
|C++ の記憶クラス指定子は、宣言するオブジェクトまたは関数の記憶期間と可視性、オブジェ
|クトを格納する場所を指定します。

構造体の宣言自体は実体を持たないので、
記憶クラス指定子(staticなど)を付けることは出来ません。

YuO [E-Mail] 2002/05/16(木) 22:37:39
>構造体の宣言自体は実体を持たないので、
>記憶クラス指定子(staticなど)を付けることは出来ません。

C言語に関しては,付けることはできますよ。
意味論として無意味なのは確かですが。

やっちゃん 2002/05/17(金) 09:44:19
[[解決]]
ご助言ありがとうございます。

質問内容はC言語での内容でした。
コンパイラは有るのですが、C言語ということもあり
エラーが出なかったために質問させていただいたのですが、
その背景の説明が不足していました。
  すみません。


無意味ということは、下記のように宣言しても
static宣言されないということですね?

-------------------------------
static struct STR_TYPE {
  ・・・
}

struct STR_TYPE a_str; ←static削除

-------------------------------

理解しやすいプログラムとしては、構造体側のstaticを削除したほうが
良いということですね。

理解しやすい、良いプログラムを作るためにまた質問させていただくかもしれませんが、
その際は、宜しくお願い致します。

YuO [E-Mail] 2002/05/17(金) 13:03:02
>static struct STR_TYPE {
>  ・・・
>}
最後に;が抜けていますね。
static struct tag {};
の形の場合,タグ自体は外部リンケージを持たないため,
内部リンケージを指定するstaticに意味はありません。


>struct STR_TYPE a_str; ←static削除

static struct STR_TYPE a_str;
と
struct STR_TYPE a_str;
は,リンケージが異なります。

struct STR_TYPEの宣言時にstaticが付いていたかどうかに関わらず,
a_strの定義時にstaticが付いていなければ外部リンケージを持ち,
staticが付いていれば内部リンケージを持ちます。
#ファイルスコープで定義した場合。

やっちゃん 2002/05/17(金) 21:08:43
>static struct STR_TYPE a_str;
>と
>struct STR_TYPE a_str;
>は,リンケージが異なります。
失礼しました。<(__)>

自分では、構造体タグ名のstaticを消去したつもりだったのですが。。。
(いいわけ:朝、ドタバタしていたもので間違えてしまいました)
(^o^;)

ご指摘ありがとうございました。

古いスレッドには追加発言できません。