3

先说一点上下文。我的程序有一个标题,work.h. 这个头文件包含一个结构、一些函数定义和一个指向我的基本函数的外部指针数组。

工作.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,所以 extern 数组上的指针将指向 3 个函数中的每一个。

我的问题是,如何将 extern 数组的指针与三个函数相关联,其次,我需要在哪个文件中执行此操作(work.cmain.c)。

我明白这个关联我需要在文件中做work.c,但没有别的。

4

1 回答 1

6

work.c

#include "work.h"

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

说明:该数组名是一个全局符号,实际上只需要在一个编译单元中定义(.o从文件生成的.c文件)。如果你没有它,链接器将找不到它。如果您有多个副本,链接器会抱怨。您只需要一个,与全局导出函数(未标记为内联)相同。

编辑:添加了显示#include "work.h",这很重要,因为它允许编译器检查extern声明是否与实际定义匹配。如果你忽略它,一切都会编译和链接而不会抱怨,但是如果有不匹配,你不会得到任何迹象,这可能会造成严重破坏,比如在其他编译单元中使用变量时损坏内存中的其他数据。

于 2013-04-11T20:28:57.423 回答