我想静态初始化一个结构,该结构将从包含某些标头的所有文件中可见。
实际意图是运行在编译时指定的函数列表,这就是我想静态初始化的原因。我想将列表放在它们所属的位置,在声明或定义它们的文件中。
人为的例子:
一般.h:
struct Widget { int (*a)(); };
富.h:
int oof1(void);
int oof2(void);
富.c:
#include "foo.h"
int oof1(void) { return 1; }
int oof2(void) { return 2; }
struct Widget foo_widgets[] = { {oof1}, {oof2} };
酒吧.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 #includes foo.h 无论如何,它总是与 foo.c 一起编译:
gcc foo.c baz.c bar.c
所以我希望有一种方法可以在源代码中反映这一点。
我不能foo_widgets
在 foo.h 中声明,因为这样我就无法在不多次定义的情况下对其进行初始化(因为 foo.h 包含在多个文件中)。
不优雅的解决方法
富.h:
...
Widget *get_foos(void) { return foo_widgets; }
酒吧.c:
...
struct Widget_lists {
struct Widget (*widget_list)();
} wlist[] =
{
{ get_foos },
{ get_bazes }
};
void usage(void) { ...; process(wlist[i].widget_list()); ... }
有没有更好的办法?