2

typedef を使用すると、struct キーワードを使用せずに構造体を参照できることを知っています。ただし、これで:

typedef struct SYSTEM SYSTEM;

CAPI でこの typedef を見たことがありますが、以前に定義されstruct SYSTEMいません。

実際、.cその行だけを含むファイルは単独でコンパイルされます。

コンパイラはSYSTEM (or struct SYSTEM)実際に何を考えていますか?

どうもありがとう!

4

3 に答える 3

5

構造体を定義する必要はありません。宣言するだけです。提示する 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.
于 2013-07-07T20:13:55.203 に答える
0

これは、グローバル名前空間で型を直接定義する 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
于 2013-07-07T20:19:00.293 に答える
-1

これは一般的に不適切な動作だと思いますが、要点は次のとおりです。

typedef 型名 _

..ここで、タイプstruct SYSTEMで、割り当てられた名前は ですSYSTEM

通常、typedef の派生元の型とは異なる名前を typedef に付けます。したがって、多くのコード管理者は、この種の動作に対して低い意見を持っている可能性があります。

于 2013-07-07T20:14:26.893 に答える