1

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会给我同样的错误。

4

2 回答 2

1

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

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

于 2021-01-18T12:59:03.717 回答
1

本声明

list* const FunctionNames = FunctionNamesCreate();

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

来自 C 标准(6.7.9 初始化)

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

这个表达

FunctionNamesCreate()

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

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

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

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

于 2021-01-18T12:50:37.867 回答