外部函数指针数组

3
首先需要一些背景信息。我的程序使用头文件work.h。该头文件包含了一个结构体、一些函数定义和对基本功能的外部指针数组。

work.h

typedef struct _foo {
  int id;
  char something[20];
} foo;

typedef void (*pointer_function)(foo *);

void do_first_to_foo(foo *);

void do_second_to_foo(foo *);

void do_third_to_foo(foo *);

extern pointer_function base_functions[3];

然后是一个名为work.c的程序,其中包含函数体,然后是主程序main.c。请注意,在头文件work.h中,我定义了三个函数的原型,并且数组的大小为3,因此外部数组上的指针将分别指向这三个函数中的每一个。

我的问题是,我如何将外部数组的指针与这三个函数关联起来,以及我需要在哪个文件中进行操作(work.c还是main.c)。

我理解这个关联操作需要在work.c文件中进行,但除此之外我不清楚。

1个回答

6
work.c 文件中:
#include "work.h"

pointer_function base_functions[] = {
    do_first_to_foo,
    do_second_to_foo,
    do_third_to_foo };

解释:该数组名称是一个全局符号,需要在一个编译单元(从.c文件生成的.o文件)中实际定义。如果没有它,链接器将无法找到它。如果有多个副本,链接器将抱怨。你只需要一个,就像全局导出函数一样(它们没有标记为内联)。
编辑:添加 #include "work.h" 显示,这很重要,因为它允许编译器检查 extern 声明是否与实际定义匹配。如果省略它,所有内容都会编译和链接而不会有任何投诉,但是如果存在不匹配,你将得不到任何指示,这可能会像在其他编译单元中使用变量时破坏其他数据一样造成严重后果。

就差那么一点点,你就赢了我 ><。 - John Bode
还有一件事我需要问。如果我需要在 main.c 中调用指针数组中的某些函数,我该如何做? - SealCuadrado
@CristianC。只需在指针表达式后面加上括号,所以对于函数指针数组:arrind; - hyde

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