我正在为我的班级编写一个程序,它以非常简化的方式模拟操作系统处理中断的方式。
在C中,我有一个我声明的数组INTERRUPT_TABLE[]
:
typedef void (*FN_TYPE)();
extern FN_TYPE INTERRUPT_TABLE[];
我想设置它,以便数组中的每个位置指向程序中其他位置包含的不同函数的开头 - 例如,INTERRUPT_TABLE[0]
应该指向函数的开头{{1 }}
我以为我可以简单地说:handle_trap()
但这不起作用。我收到一个编译器错误,上面写着“kernel.c:134:错误:下标值既不是数组也不是指针”。有谁知道我做错了什么?
感谢您的帮助。
编辑:想通了!我的INTERRUPT_TABLE高于我试图调用的函数,所以它们被自动声明为int;
答案 0 :(得分:4)
定义“不工作”。这应该工作。我怀疑我们错过了一些背景。您是否试图通过在顶层某处说INTERRUPT_TABLE[0] = handle_trap;
来初始化INTERRUPT_TABLE?该特定语法在那里不起作用,但可以在函数体中工作。或者,您可以使用初始化程序语法:
FN_TYPE INTERRUPT_TABLE[] = { handle_trap, ... };
答案 1 :(得分:1)
详细说明洛根的回答:
只有(函数和对象)声明可以出现在“外部”或文件上下文中。
虽然FN_TYPE INTERRUPT_TABLE[] = { handle_trap, ... };
是一个初始化定义,但以下内容有一个定义和一个赋值操作:
FN_TYPE INTERRUPT_TABLE[];
INTERRUPT_TABLE[0] = handle_trap;
此分配不能出现在顶层,并被解释为INTERRUPT_TABLE
的重新定义。
但是,这与您收到的错误消息不符。对于它的价值,这个简单的程序成功编译:
typedef void (*FN_TYPE) ();
extern FN_TYPE INTERRUPT_TABLE[];
void handle_trap() {
}
int main() {
INTERRUPT_TABLE[0] = handle_trap;
}
答案 2 :(得分:0)
当你在其他地方说,我认为它不在同一个文件中。因此,您需要一个声明handler_trap()的头文件,或者在使用它之前必须在C文件中手动声明它:
extern void handler_trap();
否则编译器不知道handler_trap()是一个函数,它返回的值或它期望的参数。