使用C时,初始值设定项元素不是编译时常量

使用C时,初始值设定项元素不是编译时常量,c,initialization,global-variables,constant-expression,storage-duration,C,Initialization,Global Variables,Constant Expression,Storage Duration,a、 h a、 c list是一种简单的void*链表结构 当我想创建FunctionNames全局变量时,代码编辑器会给我以下错误:a.h:8:29:error:initializer元素不是编译时常量。如果我以前没有使用常量 FunctionNames代码编辑器给出了相同的错误。此声明 list* FunctionCreate() { list* FunctionNames = listCreate(sizeof(char*)); listPushHead(FunctionN

a、 h

a、 c

list
是一种简单的
void*
链表结构

当我想创建
FunctionNames
全局变量时,代码编辑器会给我以下错误:
a.h:8:29:error:initializer元素不是编译时常量
。如果我以前没有使用
常量
FunctionNames
代码编辑器给出了相同的错误。

此声明

list* FunctionCreate() {
    list* FunctionNames = listCreate(sizeof(char*));
    listPushHead(FunctionNames,"s");
    return FunctionNames;
}
是具有静态存储持续时间的文件范围声明,可由常量编译时表达式初始化

来自C标准(6.7.9初始化)

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

这句话

list* const FunctionNames = FunctionNamesCreate();
不是编译时常量表达式。函数调用在运行时求值

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

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

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

此声明

list* FunctionCreate() {
    list* FunctionNames = listCreate(sizeof(char*));
    listPushHead(FunctionNames,"s");
    return FunctionNames;
}
是具有静态存储持续时间的文件范围声明,可由常量编译时表达式初始化

来自C标准(6.7.9初始化)

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

这句话

list* const FunctionNames = FunctionNamesCreate();
不是编译时常量表达式。函数调用在运行时求值

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

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


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

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


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

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


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

作为全局
常量创建的内容有限制。请阅读并查看。你的C代码违背了C的规则。你只能从另一个函数中调用一个函数。C不是C++,如果你用“代码”>“函数创建< /COD>和 ListPuthHead <代码>显示完整代码,我可以改进回答:你可以创建一个全局代码< const <代码> >。你的C代码违背C的规则,你只能从另一个函数中调用函数。C不是C++,如果你用“代码”>“函数创建< /COD>”和“代码> ListPuthHead <代码>显示完整代码,我可以改进答案。