1

我想要看起来像这样的代码......

static linked_list* globalListHoldingAllSortsOfGoodies = initialize_linked_list();

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

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

有什么方法可以在不破坏 C89 的情况下获得相同的效果吗?

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

4

4 回答 4

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(2000 年被 ANSI 采用)中,您可以另外使用复合文字,例如

struct node *list = &(struct node){ 42, &(struct node){ 137, 0 } };

将静态分配的节点与动态分配的节点混合是有问题的,因为释放前者会导致未定义的行为,因此有必要跟踪哪些节点属于哪个组。

于 2010-02-10T23:29:43.720 回答
1

好吧,您可以placeholdermain方法中初始化 :-)

于 2010-02-10T22:56:33.953 回答
0

不,没有这样的事情。您可以使用静态数据初始化静态变量。添加到列表中不是“静态的”。我相信大多数人所做的是编写一个预处理器来扫描源文件,在“全局列表”中找到你想要的东西,然后生成一个带有适当数据的 .c 文件(例如以 NULL 结尾的静态初始化表) .

于 2010-02-10T22:55:33.397 回答
0

正如您所注意到的,C 没有这种能力。如果您不能在 C 之外执行此操作(通过生成 C 代码),那么另一种方法是为每个需要它的模块创建一个 initialize() 函数,并确保在适当的时间调用这些函数。

于 2010-02-10T23:15:37.950 回答