如何解决初始化元素不是使用 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 举报,一经查实,本站将立刻删除。