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

Initializer element is not a compile-time constant using C

a.h

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

a.c

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();

是一个文件作用域声明,具有静态存储持续时间,可以由常量 compile-time 表达式初始化。

来自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()

不是 compile-time 常量表达式。函数调用的计算结果为 run-time.

来自 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语言代码只能在函数内部执行。在全局范围内,只能使用常量表达式来初始化变量。

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