如何在C语言中指向函数的起始位置?

3

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

在C语言中,我声明了一个数组INTERRUPT_TABLE[]

typedef void (*FN_TYPE)();

extern FN_TYPE INTERRUPT_TABLE[];

我希望设置数组中的每个位置指向程序其他位置包含的不同函数的开头 - 例如,INTERRUPT_TABLE [0] 应该指向 handle_trap() 函数的开头。

我以为可以简单地写:INTERRUPT_TABLE[0] = handle_trap; 但是这样不起作用。我收到了一个编译器错误,说“kernel.c:134:error:subscripted value is neither array nor pointer”。有人知道我做错了什么吗?

谢谢帮忙。

编辑:问题解决了!我的 INTERRUPT_TABLE 定义在我试图调用的函数之上,所以它们被自动声明为整数。


“那不起作用”是什么意思?问题具体在哪里?编译错误?链接错误?运行时错误? - Paul R
请更具体一些;有很多种可能会出现问题。语法错误?运行时错误? - plinth
我不确定,但我会尝试 INTERRUPT_TABLE[0] = &handle_trap; - Tugrul Ates
哦,抱歉!具体来说,当我编译时出现了一个错误,指出“kernel.c:134: error: subscripted value is neither array nor pointer”。 - amb691
1
你在哪里定义数组INTERRUPT_TABLE的大小?因为你的定义只包含了一行INTERRUPT_TABLE[],所以你必须在某个地方定义它的大小以便分配内存。 - JohnC
3个回答

4

“not working”是什么意思?这应该可以运行。我怀疑我们缺少一些上下文信息。你是否尝试在顶层某处使用INTERRUPT_TABLE[0] = handle_trap;来初始化INTERRUPT_TABLE?那个特定的语法在那里不起作用,但在函数体中会起作用。或者你可以使用初始化语法:

  FN_TYPE INTERRUPT_TABLE[] = { handle_trap, ... };

1
进一步解释Logan的答案:
只有(函数和对象)声明可以出现在“外部”或文件上下文中。
虽然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;
}

0

当你在其他地方提到时,我假设它不在同一个文件中。因此,你需要一个头文件声明handler_trap()或者在使用之前在你的C文件中手动声明它:

extern void handler_trap();

否则编译器不知道 handler_trap() 是一个函数,它返回什么值或者需要哪些参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接