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

标签 c initialization global-variables constant-expression storage-duration

啊啊

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 。如果我不使用constFunctionNames代码编辑器给了我同样的错误。

最佳答案

本声明

list* const FunctionNames = FunctionNamesCreate();

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

来自 C 标准(6.7.9 初始化)

4 All the expressions in an initializer for an object that has static or thread storage duration shall be constant expressions or string literals.

这个表达式

FunctionNamesCreate()

不是编译时常量表达式。函数调用在运行时计算。

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

3 Constant expressions shall not contain assignment, increment, decrement, function-call, or comma operators, except when they are contained within a subexpression that is not evaluated.

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

关于c - 初始化元素不是使用 C 的编译时常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65774807/

相关文章:

ios - Swift:便利初始化器 - 在 self.init 调用之前使用 Self

c - for循环中的return语句

c++ - 编译器生成的默认构造函数会将 std::array 中的指针初始化为 nullptr 吗?

c++ - C++:我没有得到正确的输出(菜鸟问题)

JavaScript : The global variables value cannot be changed

C:将结构读入链接列表(从文件)

python - 全局变量和局部变量的区别

c - 如何修复---->警告: extra tokens at end of#include directive

c - 在 CodeVisionAVR 中使用定时器生成正弦波形

c - sleep 和输出刷新