微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

初始化元素不是使用 C 的编译时常量

如何解决初始化元素不是使用 C 的编译时常量

a.h

list* FunctionNamesCreate();
list* const FunctionNames = FunctionNamesCreate();

交流

list* FunctionCreate() {
    list* FunctionNames = listCreate(sizeof(char*));
    listPushHead(FunctionNames,"s");
    return FunctionNames;
}

list 是简单的 void* 链表结构

当我想创建 FunctionNames 全局变量时,代码编辑器给我以下错误a.h:8:29: error: initializer element is not a compile-time constant。如果我之前不使用 const FunctionNames 代码编辑器给了我同样的错误

解决方法

本声明

list* const FunctionNames = FunctionNamesCreate();

是一个具有静态存储持续时间的文件范围声明,可以由一个常量编译时表达式初始化。

来自 C 标准(6.7.9 初始化)

4 具有静态的对象的初始值设定项中的所有表达式 或线程存储持续时间应为常量表达式或字符串 文字。

这个表达

FunctionNamesCreate()

不是编译时常量表达式。函数调用在运行时进行评估。

来自 C 标准(6.6 常量表达式)

3 常量表达式不得包含赋值、增量、 减量、函数调用或逗号运算符,除非它们是 包含在未计算的子表达式中。

无需在文件范围内声明指针。此外,当您在标题中放置带有外部链接的指针定义时,这是一种糟糕的方法。例如在 main 中声明指针。

,

在 C 语言中,代码只能在函数内部执行。在全局范围内,只能使用常量表达式来初始化变量。

静态存储对象只能使用常量表达式进行初始化。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。