C言語の構造体の隠蔽

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

C言語の構造体の隠蔽

#1

投稿記事 by march3 » 12年前

C言語の構造体の定義についての質問です。

ファイルを AAA.c と BBB.c に分割してソースを書いています。

AAA.cで構造体_hogeを定義し、この構造体にはAAA.c内からしかアクセスできないようにしたいのですが、
そんなことは可能でしょうか。
イメージ的にはstaticをつければいけるような気がしますが、
以下の警告が出たので、良い案があればご教授ください。

コード:

% gcc -c AAA.c
AAA.c:12:1: 警告: 空の宣言内に無意味な記憶域クラス指定があります [デフォルトで有効]


環境:
Ubuntu 13.04
gcc (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

AAA.c

コード:

static struct _hoge{
    int a;
    char b;
};
BBB.c

コード:

int main(void){
    struct _hoge hoge;  //こうされたくない
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C言語の構造体の隠蔽

#2

投稿記事 by softya(ソフト屋) » 12年前

staticは実体定義の時に使うものなのでstructの構造体の型宣言ではエラーになります。
AAA.cにstruct _hogeの宣言があってもBBB.c から参照不能ですの気にしなくてよいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

march3

Re: C言語の構造体の隠蔽

#3

投稿記事 by march3 » 12年前

softya(ソフト屋) さんが書きました:staticは実体定義の時に使うものなのでstructの構造体の型宣言ではエラーになります。
AAA.cにstruct _hogeの宣言があってもBBB.c から参照不能ですの気にしなくてよいです。
そうでしたか。
そもそもstaticなしでOKだとは。
たまにネット上でこういう書き方(staticで構造体の型宣言)をされているソースがあるので、
てっきり「staticで隠蔽しないとダメ」だと思い込んでました。

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: C言語の構造体の隠蔽

#4

投稿記事 by softya(ソフト屋) » 12年前

それには理由があります。

コード:

static struct _hoge{
    int a;
    char b;
} hoge; ← 変数も定義ならOKです。

static struct _hoge{ ← これだと型だけです。
    int a;
    char b;
};
【補足】
struct _hoge hoge; //関数外
だとhogeだけは外部から見えますが、struct _hogeは見えないので実質上は使えません。
static struct _hoge hoge; //とすれば外部から完全に見えなくなります。
明示的で念を入れた定義って感じでしょうが。

こういう情報は、変数のスコープで調べてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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