我在dbinfo.h中有一个简单的结构,即
typedef struct {
int fields;
} dbinfo;
在主程序中我有:
#include <string.h>
...
#include "dbinfo.h"
extern dbinfo *tst_info;
void main() {
tst_info = (dbinfo *) calloc(1, sizeof(dbinfo));
dbinfo.fields = 3;
printf("\n number of fields = %d"), getnumflds());
...
}
在另一个文件utilities.c中我有
#include "dbinfo.h"
extern dbinfo *tst_info;
int getnumflds() {
return tst_info.fields;
}
当我尝试链接时,我在tst_info的utilities.c中得到未定义的符号。 如果我删除extern,那么我没有得到任何未解析的符号,但是字段的值是0。
我在这里做错了什么?
我只是希望能够使用和更改&#39;字段&#39;在其他单独编译的函数中设置为main。
自从我使用C并且无法访问这些神经元以来已经很久了!
答案 0 :(得分:2)
除一个外,tst_info的所有定义必须为extern
。某个对象文件中变量的extern
关键字告诉链接器不要在数据段中为它分配空间,因为变量的存储将在某个其他目标文件中提供。如果所有目标文件都将变量定义为extern
,则没有为其提供存储的目标文件。
您可以在此帖中阅读有关此内容的更多信息: https://stackoverflow.com/a/1433387/773113
答案 1 :(得分:1)
您在两个翻译单元中将tst_info
声明为extern
。 extern
关键字意味着它可以在其他地方使用,有些extern
al翻译联合。在某个地方,您需要通过 not 实际定义extern
关键字,而是设置初始值(可以是calloc
或NULL
的结果或其他东西)。
您可能还会发现声明全局dbinfo
而不是dbinfo *
更容易,具体取决于您的程序的使用情况。您可以从动态运行时分配中移出的数据越多越好。