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();
是一个具有静态存储持续时间的文件范围声明,该声明可以由常量编译时表达式初始化。
来自C标准(6.7.9初始化)
4具有静态值的对象的初始值设定项中的所有表达式或线程存储持续时间应为常量表达式或字符串文字。
此表达式
FunctionNamesCreate()
不是编译时常量表达式。函数调用在运行时求值。
来自C标准(6.6常数表达式)
3常量表达式不应包含赋值、增量、,减量、函数调用或逗号运算符,除非它们是包含在未计算的子表达式中。
不需要在文件范围内声明指针。此外,当您在标头中放置具有外部链接的指针定义时,这是一种糟糕的方法。例如在main中声明指针。
在C语言中,代码只能在函数内部执行。在全局作用域中,只有常量表达式可以用于初始化变量。
静态存储对象只能使用常量表达式进行初始化。