我想要代码看起来像这样...
static linked_list* globalListHoldingAllSortsOfGoodies = initialize_linked_list();
/* [In a different file...] */
static int placeholder = add_to_global_list(goodies);但在C中,非常数初始化是不可能的。
有没有什么方法可以在不破坏C89的情况下获得同样的效果?
重点是让不同的东西“自动注册”到全局列表中,方法是用一个也使用占位符的宏来声明好的东西。
发布于 2010-02-11 07:29:44
您可以从静态数据构建链表。在美国国家标准协会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年采用)中,你还可以使用复合文字,例如
struct node *list = &(struct node){ 42, &(struct node){ 137, 0 } };混合静态分配的节点和动态分配的节点是有问题的,因为释放静态分配的节点将导致未定义的行为,因此有必要跟踪哪些节点属于哪个组。
发布于 2010-02-11 06:56:34
您可以在main方法中初始化placeholder :-)
发布于 2010-02-11 06:55:33
不,根本没有这回事。您可以使用静态数据初始化静态变量。添加到列表不是“静态”的。我相信大多数人所做的是编写一个预处理器来扫描源文件,在“全局列表”中找到你想要的东西,然后用适当的数据生成一个.c文件(例如,以NULL结尾的静态初始化表)。
https://stackoverflow.com/questions/2240928
复制相似问题