【发布时间】:2018-01-08 14:33:40
【问题描述】:
我在 dbinfo.h viz 中有一个简单的结构。
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 的实用程序.c 中得到未定义的符号。 如果我删除 extern,则不会得到未解析的符号,但字段的值为 0。
我在这里做错了什么?
我只是希望能够在单独编译的其他函数中使用和更改 main 中设置的“字段”的值。
我已经很久没有使用 C 并且无法访问这些神经元了!
【问题讨论】:
-
没错,多说一点。 Extern 只是告诉“变量是编译器,相信我。”但是你从来没有真正做到过,所以链接器找不到它。只需从其中一个文件中删除 extern。
-
不明白。在主程序中,我指定它是 extern 并分配它。
-
当我从主程序中删除 extern,并在子程序中引用“字段”时,即使我在主程序中将它设置为 3,它也是零。
-
不要滥用外部变量。函数中需要的所有数据都应该作为参数传递给它。
-
在我看来,您从未在任何地方真正定义符号,这意味着它没有在您的程序中分配地址,因此访问它就变成了纯 UB。您观察到的特定结果只是偶然事件。
标签: c