web-dev-qa-db-ja.com

typedef構造体でstaticを使用する

私はCで次のコードをよく使用します。

typedef struct
  {
  int member;
  } structname;

今、私はその構造体定義を特定のソースファイルに対してローカルに保とうとしているので、他のソースファイルは構造体が存在することさえ知りません。私は以下を試しました:

static typedef struct
  {
  int member;
  } structname;

しかし、GCCは、不正なアクセス指定子のために泣き言を言います。構造体の宣言をソースファイルに対してプライベートに保つことさえ可能ですか?

17
nuju

.cファイル内でtypedef構造体を宣言すると、そのソースファイルに対してプライベートになります。

このtypedefを.hファイルで宣言すると、このヘッダーファイルを含むすべての.cファイルにアクセスできるようになります。

あなたの声明:

static typedef struct

変数を宣言したり、新しい型を定義したりしていないため、明らかに違法です。

34

すべての宣言は常にCの特定の翻訳単位に対してローカルです。そのため、特定の宣言を使用する予定のすべてのソースファイルにヘッダーを含める必要があります。

structの使用を制限する場合は、それを使用するファイルで宣言するか、ファイルのみに含まれる特別なヘッダーを作成します。

5
Carl Norum

構造体定義は、共有ヘッダーファイルに配置されない限り、ソースファイルに対してプライベートです。構造体へのポインタが指定されている場合でも、他のソースファイルは構造体のメンバーにアクセスできません(他のコンパイルユニットではレイアウトが不明であるため)。

構造体を他の場所で使用する必要がある場合は、ポインターとしてのみ使用する必要があります。 struct structname; typedef struct structname structname;形式の前方宣言をヘッダーファイルに入れ、コードベースの他のすべての場所でstructname *を使用します。次に、構造体のメンバーは1つのソースファイルにのみ表示されるため、構造体のコンテンツは事実上そのファイルに対して「プライベート」になります。

4
nneonneo

Hernan Velasquezの答えは正解です。コードスニペットにいくつか問題があります。反例は次のとおりです。

/* This should go in a .h if you will use this typedef in multiple .c files */
typedef struct {
  int a;
  char b[8];
} mystructdef;

int
main (int argc, char *argv[])
{
  /* "static" is legal when you define the variable ...
    ... but *not* when you declare the typedef */
  static mystructdef ms;
1
paulsm4