C中的静态初始化

时间:2010-02-10 22:51:18

标签: c static c89

我希望代码看起来像这样......

static linked_list* globalListHoldingAllSortsOfGoodies = initialize_linked_list();

/* [In a different file...] */
static int placeholder = add_to_global_list(goodies);

但是在C中不可能进行非常量初始化。

有没有办法在不破坏C89的情况下获得相同的效果?

关键是要通过使用也使用占位符的宏声明好东西,让自己“自动注册”到全局列表中。

4 个答案:

答案 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()函数,并确保在适当的时候调用这些函数。