首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C语言中的静态初始化

C语言中的静态初始化
EN

Stack Overflow用户
提问于 2010-02-11 06:51:18
回答 4查看 4.5K关注 0票数 1

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

代码语言:javascript
运行
复制
static linked_list* globalListHoldingAllSortsOfGoodies = initialize_linked_list();

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

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

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

重点是让不同的东西“自动注册”到全局列表中,方法是用一个也使用占位符的宏来声明好的东西。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-11 07:29:44

您可以从静态数据构建链表。在美国国家标准协会C89 (又称ISO C90)中,它可能如下所示:

代码语言:javascript
运行
复制
struct node
{
 int data;
 struct node *next;
};

struct node nodes[] = { { 42, &nodes[1] }, { 137, 0 } };
struct node *list = nodes;

在ISO C99 (美国国家标准协会于2000年采用)中,你还可以使用复合文字,例如

代码语言:javascript
运行
复制
struct node *list = &(struct node){ 42, &(struct node){ 137, 0 } };

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

票数 4
EN

Stack Overflow用户

发布于 2010-02-11 06:56:34

您可以在main方法中初始化placeholder :-)

票数 1
EN

Stack Overflow用户

发布于 2010-02-11 06:55:33

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2240928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档