私はCで次のコードをよく使用します。
typedef struct
{
int member;
} structname;
今、私はその構造体定義を特定のソースファイルに対してローカルに保とうとしているので、他のソースファイルは構造体が存在することさえ知りません。私は以下を試しました:
static typedef struct
{
int member;
} structname;
しかし、GCCは、不正なアクセス指定子のために泣き言を言います。構造体の宣言をソースファイルに対してプライベートに保つことさえ可能ですか?
.cファイル内でtypedef構造体を宣言すると、そのソースファイルに対してプライベートになります。
このtypedefを.hファイルで宣言すると、このヘッダーファイルを含むすべての.cファイルにアクセスできるようになります。
あなたの声明:
static typedef struct
変数を宣言したり、新しい型を定義したりしていないため、明らかに違法です。
すべての宣言は常にCの特定の翻訳単位に対してローカルです。そのため、特定の宣言を使用する予定のすべてのソースファイルにヘッダーを含める必要があります。
struct
の使用を制限する場合は、それを使用するファイルで宣言するか、ファイルのみに含まれる特別なヘッダーを作成します。
構造体定義は、共有ヘッダーファイルに配置されない限り、ソースファイルに対してプライベートです。構造体へのポインタが指定されている場合でも、他のソースファイルは構造体のメンバーにアクセスできません(他のコンパイルユニットではレイアウトが不明であるため)。
構造体を他の場所で使用する必要がある場合は、ポインターとしてのみ使用する必要があります。 struct structname; typedef struct structname structname;
形式の前方宣言をヘッダーファイルに入れ、コードベースの他のすべての場所でstructname *
を使用します。次に、構造体のメンバーは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;