C 结构指针的未定义符号

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) {

我正在处理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)
{
    ++(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
文件中声明了结构,并将其包含在我的文件中,它工作起来非常神奇。