字符串数组初始值设定项错误:初始值设定项元素不是常量
Error in string array initializer: initializer element is not constant
我需要定义一些字符串和一个用这些字符串初始化的数组,以供软件的不同部分使用。我想在这样的头文件中定义它们:
//.h file
const char *serviceStateKindNormal = "Normal";
const char *serviceStateKindUnmanned = "Unmanned";
const char *serviceStateKindScheduledMaintenanceDown = "ScheduledMaintenance (down)";
const char *serviceStateKindScheduledMaintenanceAvailable = "ScheduledMaintenance (available)";
const char *serviceStateKindMajorIncidentInProgress = "MajorIncidentInProgress";
const char *serviceStateKindPartialService = "PartialService";
const char *serviceStateKindOverloaded = "Overloaded";
const char *serviceStateKindGoingDown = "GoingDown";
const char *serviceStateKindDown = "Down";
const char *serviceStateKind[9] = {
serviceStateKindNormal,
serviceStateKindUnmanned,
serviceStateKindScheduledMaintenanceDown,
serviceStateKindScheduledMaintenanceAvailable,
serviceStateKindMajorIncidentInProgress,
serviceStateKindPartialService,
serviceStateKindOverloaded,
serviceStateKindGoingDown,
serviceStateKindDown
};
但编译器显示
error: initializer element is not constant
serviceStateKindNormal
这里的问题到底是什么?我有哪些选择来定义我的变量?
在C语言中常量是指文字常量,如(3.14
、2.718
等)。
Const 限定对象(任何类型)在 C 语言术语中不是常量。
要创建 C 语言术语中的常量,请使用 #define
指令,例如:
#define ServiceStateKindNormal "Normal"
等等
在文件范围内声明的变量初始化中放入的所有内容都必须是 constant expression or a string literal, from initialization。有一个列表什么是常量表达式和变量值不在其中。所以:
// there is an array of char[2]{'a',[=10=]'} somewhere in the memory
// we store the pointer value to that array inside the variable a
static const char *a = "a";
// now we want to statically initialize variable b with the same value
static const char *b = a;
不会起作用,因为 b
是用指针 a
value 初始化的,它不是常量表达式。初始化具有静态存储持续时间的变量时需要常量表达式。
你能做什么?以下:
好方法:为什么要存储指向字符串文字的指针"Normal"
?为什么不将数据本身存储在数组中?幸运的是,变量地址是一个常量表达式,所以我们可以在初始化时使用它!请注意,(几乎)所有用例和语义都保持不变,除了一些角落用法,如 sizeof(serviceStateKindNormal)
运算符结果。
const char serviceStateKindNormal[] = "Normal";
const char serviceStateKindUnmanned[] = "Unmanned";
const char *serviceStateKind[] = {
serviceStateKindNormal,
serviceStateKindUnmanned,
};
一种奇怪的方式:将指向字符串的指针存储在数组中。由于变量地址是常量表达式,因此这将起作用。请注意,这使 serviceStateKind
成为三星级变量。您需要在使用时对数组进行双重取消引用。 serviceStateKind
是指向字符串的指针数组。请注意,如何使用此类数组非常混乱,因此我建议您使用结构。
const char *serviceStateKindNormal = "Normal";
const char *serviceStateKindUnmanned = "Unmanned";
const char **serviceStateKind[] = {
&serviceStateKindNormal,
&serviceStateKindUnmanned,
};
int main() {
// question which one is correct?
printf("%s\n", *serviceStateKind[1]);
printf("%s\n", (*serviceStateKind)[1]);
printf("%s\n", serviceStateKind[0][1]);
}
但由于我不认为自己是三星级程序员,所以我会尝试至少达到两星级:
const char *serviceStateKindNormal = "Normal";
const char *serviceStateKindUnmanned = "Unmanned";
struct {
// points to a string
const char **pnt;
// an array of pointers to string
} serviceStateKind[] = {
&serviceStateKindNormal,
&serviceStateKindUnmanned,
};
int main() {
// more verbose
printf("%s\n", *serviceStateKind[0].pnt);
}
老式的方法 - 宏。不要这样做。它的坏处是,您可以滥用字符串文字的预处理器连接,将它们连接在一起。
#define serviceStateKindNormal "Normal"
#define serviceStateKindUnmanned "Unmanned"
const char *serviceStateKind[] = {
serviceStateKindNormal,
serviceStateKindUnmanned,
};
int main() {
# magic
printf(serviceStateKindNormal " " serviceStateKindUnmanned "\n");
}
I thought in defining them in a header file like this:
如果您在头文件中定义变量,您希望用 static
标记它们,这样您就不会在链接到使用该头文件的不同 .c
文件时出现重复符号错误.h
文件。将变量标记为 const
也很好,以向其他程序员提示它们有些不可更改。
我需要定义一些字符串和一个用这些字符串初始化的数组,以供软件的不同部分使用。我想在这样的头文件中定义它们:
//.h file
const char *serviceStateKindNormal = "Normal";
const char *serviceStateKindUnmanned = "Unmanned";
const char *serviceStateKindScheduledMaintenanceDown = "ScheduledMaintenance (down)";
const char *serviceStateKindScheduledMaintenanceAvailable = "ScheduledMaintenance (available)";
const char *serviceStateKindMajorIncidentInProgress = "MajorIncidentInProgress";
const char *serviceStateKindPartialService = "PartialService";
const char *serviceStateKindOverloaded = "Overloaded";
const char *serviceStateKindGoingDown = "GoingDown";
const char *serviceStateKindDown = "Down";
const char *serviceStateKind[9] = {
serviceStateKindNormal,
serviceStateKindUnmanned,
serviceStateKindScheduledMaintenanceDown,
serviceStateKindScheduledMaintenanceAvailable,
serviceStateKindMajorIncidentInProgress,
serviceStateKindPartialService,
serviceStateKindOverloaded,
serviceStateKindGoingDown,
serviceStateKindDown
};
但编译器显示
error: initializer element is not constant
serviceStateKindNormal
这里的问题到底是什么?我有哪些选择来定义我的变量?
在C语言中常量是指文字常量,如(3.14
、2.718
等)。
Const 限定对象(任何类型)在 C 语言术语中不是常量。
要创建 C 语言术语中的常量,请使用 #define
指令,例如:
#define ServiceStateKindNormal "Normal"
等等
在文件范围内声明的变量初始化中放入的所有内容都必须是 constant expression or a string literal, from initialization。有一个列表什么是常量表达式和变量值不在其中。所以:
// there is an array of char[2]{'a',[=10=]'} somewhere in the memory
// we store the pointer value to that array inside the variable a
static const char *a = "a";
// now we want to statically initialize variable b with the same value
static const char *b = a;
不会起作用,因为 b
是用指针 a
value 初始化的,它不是常量表达式。初始化具有静态存储持续时间的变量时需要常量表达式。
你能做什么?以下:
好方法:为什么要存储指向字符串文字的指针
"Normal"
?为什么不将数据本身存储在数组中?幸运的是,变量地址是一个常量表达式,所以我们可以在初始化时使用它!请注意,(几乎)所有用例和语义都保持不变,除了一些角落用法,如sizeof(serviceStateKindNormal)
运算符结果。const char serviceStateKindNormal[] = "Normal"; const char serviceStateKindUnmanned[] = "Unmanned"; const char *serviceStateKind[] = { serviceStateKindNormal, serviceStateKindUnmanned, };
一种奇怪的方式:将指向字符串的指针存储在数组中。由于变量地址是常量表达式,因此这将起作用。请注意,这使
serviceStateKind
成为三星级变量。您需要在使用时对数组进行双重取消引用。serviceStateKind
是指向字符串的指针数组。请注意,如何使用此类数组非常混乱,因此我建议您使用结构。const char *serviceStateKindNormal = "Normal"; const char *serviceStateKindUnmanned = "Unmanned"; const char **serviceStateKind[] = { &serviceStateKindNormal, &serviceStateKindUnmanned, }; int main() { // question which one is correct? printf("%s\n", *serviceStateKind[1]); printf("%s\n", (*serviceStateKind)[1]); printf("%s\n", serviceStateKind[0][1]); }
但由于我不认为自己是三星级程序员,所以我会尝试至少达到两星级:
const char *serviceStateKindNormal = "Normal";
const char *serviceStateKindUnmanned = "Unmanned";
struct {
// points to a string
const char **pnt;
// an array of pointers to string
} serviceStateKind[] = {
&serviceStateKindNormal,
&serviceStateKindUnmanned,
};
int main() {
// more verbose
printf("%s\n", *serviceStateKind[0].pnt);
}
老式的方法 - 宏。不要这样做。它的坏处是,您可以滥用字符串文字的预处理器连接,将它们连接在一起。
#define serviceStateKindNormal "Normal" #define serviceStateKindUnmanned "Unmanned" const char *serviceStateKind[] = { serviceStateKindNormal, serviceStateKindUnmanned, }; int main() { # magic printf(serviceStateKindNormal " " serviceStateKindUnmanned "\n"); }
I thought in defining them in a header file like this:
如果您在头文件中定义变量,您希望用 static
标记它们,这样您就不会在链接到使用该头文件的不同 .c
文件时出现重复符号错误.h
文件。将变量标记为 const
也很好,以向其他程序员提示它们有些不可更改。