我希望代码看起来像这样......
static linked_list* globalListHoldingAllSortsOfGoodies = initialize_linked_list();
/* [In a different file...] */
static int placeholder = add_to_global_list(goodies);
但是在C中不可能进行非常量初始化。
有没有办法在不破坏C89的情况下获得相同的效果?
关键是要通过使用也使用占位符的宏声明好东西,让自己“自动注册”到全局列表中。
答案 0 :(得分:4)
您可以从静态数据构建链接列表。在ANSI C89(又名ISO C90)中,它可能如下所示:
struct node
{
int data;
struct node *next;
};
struct node nodes[] = { { 42, &nodes[1] }, { 137, 0 } };
struct node *list = nodes;
在ISO C99(ANSI于2000年采用)中,您还可以使用复合文字,例如
struct node *list = &(struct node){ 42, &(struct node){ 137, 0 } };
将静态分配的节点与动态分配的节点混合是有问题的,因为释放前者将导致未定义的行为,因此有必要跟踪哪些节点属于哪个组。
答案 1 :(得分:1)
好吧,您可以在placeholder
方法中初始化main
: - )
答案 2 :(得分:0)
不,没有这样的事情。您可以使用静态数据初始化静态变量。添加到列表不是“静态”。 我相信大多数人所做的是编写一个预处理器来扫描源文件,在“全局列表”中找到你想要的东西,然后用适当的数据生成一个.c文件(例如,以NULL结尾的静态初始化表)
答案 3 :(得分:0)
正如您所注意到的,C没有此功能。如果你不能在C之外做(通过生成C代码),那么另一种方法是为需要它的每个模块创建一个initialize()函数,并确保在适当的时候调用这些函数。