typedef を使用すると、struct キーワードを使用せずに構造体を参照できることを知っています。ただし、これで:
typedef struct SYSTEM SYSTEM;
C
API でこの typedef を見たことがありますが、以前に定義されstruct SYSTEM
ていません。
実際、.c
その行だけを含むファイルは単独でコンパイルされます。
コンパイラはSYSTEM (or struct SYSTEM)
実際に何を考えていますか?
どうもありがとう!
構造体を定義する必要はありません。宣言するだけです。提示する typedef 宣言は、 の宣言を包含しますstruct SYSTEM
。
したがって、次と同等です。
struct SYSTEM;
typedef struct SYSTEM SYSTEM;
この typedef のおかげで、は不完全な型に名前を付けるようになったので、非公開にできる構造体の実際の定義を公開する必要なく、インターフェース定義のSYSTEM
ように使用できます。SYSTEM *
public_header.h:
typedef struct SYSTEM SYSTEM;
SYSTEM * create_system();
int do_useful_thing_with(SYSTEM * system, int count, void * addr);
void destroy_system(SYSTEM * system);
private_impl.c:
#include <public_header.h>
struct SYSTEM { int a; char b[12]; float q; void * next; };
SYSTEM * create_system()
{
SYSTEM * p = malloc(sizeof *p);
if (p) { p->a = 2; p->q = 1.5; }
return p;
}
void destroy_system(SYSTEM * system)
{
free(system);
}
// etc.
これは、グローバル名前空間で型を直接定義する C++ や Java などとは対照的に、典型的な C 構造です。C 構造体は名前だけではアクセスできないためtypedef
、SYSTEM だけを呼び出すには が必要ですSYSTEM
。
struct SYSTEM {
...
};
struct SYSTEM foo; //legal
SYSTEM bar; //illegal
typedef struct SYSTEM SYSTEM; //give it a global name
SYSTEM baz; //now it's legal
これは一般的に不適切な動作だと思いますが、要点は次のとおりです。
typedef
型名 _
..ここで、タイプはstruct SYSTEM
で、割り当てられた名前は ですSYSTEM
。
通常、typedef の派生元の型とは異なる名前を typedef に付けます。したがって、多くのコード管理者は、この種の動作に対して低い意見を持っている可能性があります。