20

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

typedef struct
  {
  int member;
  } structname;

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

static typedef struct
  {
  int member;
  } structname;

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

4

4 に答える 4

37

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

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

あなたの声明:

static typedef struct

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

于 2012-09-16T05:33:40.310 に答える
5

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

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

于 2012-09-16T05:33:14.573 に答える
4

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

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

于 2012-09-16T05:32:30.027 に答える
1

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;
于 2012-09-16T05:40:40.770 に答える