C 结构指针的未定义符号
我正在处理xinu,需要更改一些C 结构指针的未定义符号,c,extern,C,Extern,我正在处理xinu,需要更改一些*.c文件。 我在文件ready.c中有这个结构: struct newtimer{ struct newtimer* tnext; struct newtimer* tprev; int tkey; int tprio; int tcount; }; struct newtimer *t; extern struct newtimer *timer; ... t = timer; while(t!= NULL) {
*.c
文件。
我在文件ready.c
中有这个结构:
struct newtimer{
struct newtimer* tnext;
struct newtimer* tprev;
int tkey;
int tprio;
int tcount;
};
struct newtimer *t;
extern struct newtimer *timer;
...
t = timer;
while(t!= NULL)
{
++(t->tcount);
if(t->tcount >= 18){
t->tcount = 0;
newprior = proctab[t->tkey]->pprio + 10;
t->tcount = newprior;
chprio(t->tkey, newprior);
}
t = t->tnext;
resched();
}
然后我宣布:
struct newtimer *timer = NULL;
我在这个文件中使用了timer变量,我还需要在另一个文件中使用它(clkint.c
)。因此,在clkint
中,我做了以下工作:
extern struct newtimer *timer;
(哪一个可以编译)
但当我尝试访问计时器字段时,会出现以下错误:
我做错了什么
多谢各位
编辑:
根据要求,以下是一些clkint.c
:
struct newtimer{
struct newtimer* tnext;
struct newtimer* tprev;
int tkey;
int tprio;
int tcount;
};
struct newtimer *t;
extern struct newtimer *timer;
...
t = timer;
while(t!= NULL)
{
++(t->tcount);
if(t->tcount >= 18){
t->tcount = 0;
newprior = proctab[t->tkey]->pprio + 10;
t->tcount = newprior;
chprio(t->tkey, newprior);
}
t = t->tnext;
resched();
}
编辑:
将所有
t
s替换为timer
s不会解决问题。您的struct newtimer
类型未定义。您可能忘记包含定义struct newtimer
的头文件
当您在struct something
中使用未知的结构名时,C编译器将其视为一个全新结构类型的正向声明。当然,该类型是不完整的,这就是为什么不允许您访问该类型的任何内部。编译器对这些内部结构一无所知
您的
struct newtimer
在哪里定义?如果它是在头文件中定义的,则必须将其包含在clkint.c
中。我们可以查看函数clkint的内容吗?看起来您需要一个.h
头文件来声明您的newtimer
结构,这样您就可以将它插入到clkint.c中,这样clkint.c就可以知道它的结构。@Dogbert:您的代码的结果是非常确定的
——我从来没有说过它不是。但是OP假设C编译器可以通过查看extern
声明来推断结构,我认为这是不可能的。这里没有人侮辱C编译器。:)在.C
文件中声明C结构时,为什么要导出它的定义?除非你包括这个,编译器必须知道什么?Turbo C++ 3?!!!真的吗?你和其他所有说我需要.h
文件的人都是对的。相反,我在一些.h
文件中声明了结构,并将其包含在我的文件中,它工作起来非常神奇。