要解釋C標準,不完整類型是描述對象的類型,但缺少確定其大小所需的信息。
void是另一種不完整類型。不像其他不完整的類型,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);
你不需要'結構令牌'被定義(甚至沒有被聲明)來獲取指向它的指針的大小。 –