ページ 11

C言語の構造体の隠蔽

Posted: 2014年1月03日(金) 18:39
by march3
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;  //こうされたくない
}

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

Posted: 2014年1月03日(金) 19:00
by softya(ソフト屋)
staticは実体定義の時に使うものなのでstructの構造体の型宣言ではエラーになります。
AAA.cにstruct _hogeの宣言があってもBBB.c から参照不能ですの気にしなくてよいです。

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

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

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

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

Posted: 2014年1月03日(金) 19:37
by softya(ソフト屋)
それには理由があります。

コード:

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; //とすれば外部から完全に見えなくなります。
明示的で念を入れた定義って感じでしょうが。

こういう情報は、変数のスコープで調べてみてください。