Sea*_*ado 3 c arrays typedef extern
首先是一点背景.我的程序有一个标题,work.h.这个头包含一个结构,一些函数定义,以及指向我的基函数的extern指针数组.
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];
Run Code Online (Sandbox Code Playgroud)
然后一个程序work.c用函数体调用,然后是主程序main.c.在标题work.h中观察我已经定义了三个函数的原型,并且数组的大小是3,因此extern数组上的指针将指向3个函数中的每一个.
我的问题是,我如何将extern数组的指针与三个函数关联起来,其次,我需要在哪个文件中执行它(work.c或main.c).
我理解我需要在文件中执行此关联work.c,但没有别的.
在work.c:
#include "work.h"
pointer_function base_functions[] = {
do_first_to_foo,
do_second_to_foo,
do_third_to_foo };
Run Code Online (Sandbox Code Playgroud)
说明:该数组名称是全局符号,需要在一个编译单元(.o从.c文件生成的文件)中实际定义.如果您没有它,链接器将找不到它.如果您有多个副本,链接器会抱怨.您只需要一个,与全局导出函数(未标记为内联)相同.
编辑:添加显示#include "work.h",这很重要,因为它允许编译器检查extern声明是否与实际定义匹配.如果你把它遗漏了,一切都会编译和链接没有抱怨,但你没有迹象表明是否存在不匹配,当其他编译单元中使用变量时,这可能会破坏内存中的损坏的其他数据.