初始化元素不是使用 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语言代码只能在函数内部执行。在全局范围内,只能使用常量表达式来初始化变量。
静态存储对象只能使用常量表达式进行初始化。
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语言代码只能在函数内部执行。在全局范围内,只能使用常量表达式来初始化变量。
静态存储对象只能使用常量表达式进行初始化。