我想静态初始化一个结构,该结构将在包含某个头文件的所有文件中可见。C:使用外部链接初始化全局常量
实际意图是运行在编译时指定的函数列表,这就是为什么我要静态初始化的原因。我想将它们所属的列表放在它们被声明或定义的文件中。
人为的例子:
general.h中:
struct Widget { int (*a)(); };
foo.h中:
int oof1(void);
int oof2(void);
foo.c的:
#include "foo.h"
int oof1(void) { return 1; }
int oof2(void) { return 2; }
struct Widget foo_widgets[] = { {oof1}, {oof2} };
bar.c:
#include "foo.h"
#include "baz.h"
struct Widget *foo_widgets;
struct Widget *baz_widgets;
struct WidgetsContainer {
struct Widget *widget_list;
} wlists[] =
{
{ foo_widgets },
{ baz_widgets }
};
void usage(void) { ... ; process (wlists[i].widget_list); ... }
这显然是行不通的,因为“初始化剂元素不是常量” - 这是因为当编译器在翻译bar.c,它认为它不知道foo_widgets(或bar_widgets)的位置。
但由于bar.c#包括了foo.h无论如何,它总是编译旁边的foo.c:
gcc foo.c baz.c bar.c
所以我希望有一个在源代码中反映这一点的方式。
我不能在foo.h中声明foo_widgets
,因为那样我将无法多次初始化它(因为foo.h包含在多个文件中)。
不雅的解决办法
了foo.h:
...
Widget *get_foos(void) { return foo_widgets; }
bar.c:
...
struct Widget_lists {
struct Widget (*widget_list)();
} wlist[] =
{
{ get_foos },
{ get_bazes }
};
void usage(void) { ...; process(wlist[i].widget_list()); ... }
有没有更好的办法?
谢谢:-)没有意识到你需要指定声明和定义的数组大小。 该结构对于存储与每个函数关联的附加数据是必需的。 – user234461
@ user234461当然初始化可以为结构成员完成,它只是更多_“有些烦人”_,我留给你;) – Rerito