因此,我对各种事物的链接有些困惑。对于这个问题,我将专注于不透明的指针。
我将用一个例子来说明我的困惑。假设我有这三个文件:
主程序
#include <stdio.h>
#include "obj.h" //this directive is replaced with the code in obj.h
int main()
{
myobj = make_obj();
setid(myobj, 6);
int i = getid(myobj);
printf("ID: %i\n",i);
getchar();
return 0;
}
对象.c
#include <stdlib.h>
struct obj{
int id;
};
struct obj *make_obj(void){
return calloc(1, sizeof(struct obj));
};
void setid(struct obj *o, int i){
o->id = i;
};
int getid(struct obj *o){
return o->id;
};
对象.h
struct obj;
struct obj *make_obj(void);
void setid(struct obj *o, int i);
int getid(struct obj *o);
struct obj *myobj;
由于预处理器指令,它们本质上将成为两个文件:
(我知道从技术上讲 stdio.h 和 stdlib.h 会让他们的代码替换预处理器指令,但为了可读性我没有费心去替换它们)
主程序
#include <stdio.h>
//obj.h
struct obj;
struct obj *make_obj(void);
void setid(struct obj *o, int i);
int getid(struct obj *o);
struct obj *myobj;
int main()
{
myobj = make_obj();
setid(myobj, 6);
int i = getid(myobj);
printf("ID: %i\n",i);
getchar();
return 0;
}
对象.c
#include <stdlib.h>
struct obj{
int id;
};
struct obj *make_obj(void){
return calloc(1, sizeof(struct obj));
};
void setid(struct obj *o, int i){
o->id = i;
};
int getid(struct obj *o){
return o->id;
};
现在这里是我有点困惑的地方。如果我尝试在 main.c 中创建一个 struct obj,我会收到一个不完整的类型错误,即使 main.c 有声明struct obj;
。
即使我将代码更改为 use extern
,它仍然无法编译:
主程序
#include <stdio.h>
extern struct obj;
int main()
{
struct obj myobj;
myobj.id = 5;
int i = myobj.id;
printf("ID: %i\n",i);
getchar();
return 0;
}
对象.c
#include <stdlib.h>
struct obj{
int id;
};
据我所知,main.c 和 obj.c 不通信结构(与某些只需要在另一个文件中声明的函数或变量不同)。
因此,main.c 与 struct obj 类型没有链接,但出于某种原因,在前面的示例中,它能够创建一个指向 one 的指针就好了struct obj *myobj;
。怎么,为什么?我觉得我错过了一些重要的信息。关于什么可以或不可以从一个 .c 文件转到另一个的规则是什么?
附录
为了解决可能的重复,我必须强调,我不是在问什么是不透明指针,而是它在文件链接方面的作用。