【发布时间】:2019-12-18 03:36:00
【问题描述】:
我正在尝试使用不透明的数据类型来了解它们。主要问题是我不断收到“不完整”错误。
main.c
#include <stdio.h>
#include <stdlib.h>
#include "blepz.h"
int main()
{
setfnarp(GOO,5);
int loogaboo = getfnarp(GOO);
printf("%i", loogaboo);
return 0;
}
fnarpishnoop.c
#include "blepz.h"
struct noobza {
int fnarp;
};
void setfnarp(struct noobza x, int i){
x.fnarp = i;
};
int getfnarp(struct noobza x){
return x.fnarp;
};
blepz.h
struct noobza;
void setfnarp(struct noobza x, int i);
int getfnarp(struct noobza x);
struct noobza GOO;
我显然不明白这里的一些东西,我希望有人能帮助我弄清楚不透明数据类型是如何实现的,如果它们的全部意义在于你很难找到它们的实际代码。
【问题讨论】:
-
你通常不应该做的一件事是在头文件中声明变量。在这种情况下,不要将
struct noobza GOO放在头文件中。由于您只在main.c中使用它,因此在此处声明它。这也应该可以帮助你理解为什么你不能在main.c中使用struct noobza GOO;,因为只有fnarpishnoop.c知道结构的样子。但是,您可以使用指向不完整类型的指针,因为无论如何指针都有固定的大小,编译器不必知道所指向的实际结构的样子。所以基本上,删除blepz.h的最后一行并根据.y修复。 -
@Cheatah 当然,如果我使用
struct noobza GOO;超过main.c,我将不得不将它放在头文件中以赋予它一个全局范围,不是吗?
标签: c struct opaque-pointers