我怎样才能指向C中函数的开头?

时间:2011-02-28 14:36:36

标签: c function-pointers

我正在为我的班级编写一个程序,它以非常简化的方式模拟操作系统处理中断的方式。

在C中,我有一个我声明的数组INTERRUPT_TABLE[]

typedef void (*FN_TYPE)();

extern FN_TYPE INTERRUPT_TABLE[];

我想设置它,以便数组中的每个位置指向程序中其他位置包含的不同函数的开头 - 例如,INTERRUPT_TABLE[0]应该指向函数的开头{{1 }}

我以为我可以简单地说:handle_trap()但这不起作用。我收到一个编译器错误,上面写着“kernel.c:134:错误:下标值既不是数组也不是指针”。有谁知道我做错了什么?

感谢您的帮助。

编辑:想通了!我的INTERRUPT_TABLE高于我试图调用的函数,所以它们被自动声明为int;

3 个答案:

答案 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()是一个函数,它返回的值或它期望的参数。