C標準の言い換えでは、不完全型は オブジェクトを記述する型ですが、サイズを決定するために必要な情報はありません。
voidは、もう1つの不完全な型です。他の不完全な型とは異なり、voidは を完了できません。
この「不完全型」はハンドルの種類によく使用されます。ライブラリでは、「ハンドル」を何かに割り当てて処理し、再度処分できます。これらはすべてライブラリにカプセル化されています。ユーザーは内部で何が起こるか分かりません。
例:
lib.h:
struct data * d_generate(void);
void d_set(struct data *, int);
int d_get(struct data *);
void d_free(struct data*);
lib.c:
#include "lib.h"
#include <stdlib.h>
struct data { int value; };
struct data * d_generate(void) {
return malloc(sizeof(struct data))
}
void d_set(struct data * d, int v) {
d -> value = v;
}
int d_get(struct data * d) {
return d->value;
}
void d_free(struct data* d) {
free(d);
}
user.c:
#include "lib.h"
[...]
struct data * d = d_generate();
d_set(d, 42);
int v = d_get(d);
// but v = d->value; doesn't work here because of the incomplete definition.
d_free(d);
あなたは '構造体のトークンを必要としません'それを指すポインタにサイズを渡すために定義される(宣言されることさえありません)。 –