当我将static const char[]
作为公共字段添加到我的类时,编译器会给我错误,但是static const int
它很好。为什么,我该如何解决?
class example
{
public:
static const int num2 = 5;// fine
static const char num[] = "test";// problem
};
答案 0 :(得分:7)
C ++语言不支持非整数和非枚举类型的 static 成员的类内初始化程序。整数和枚举类型的成员给予特殊处理。您可以在类定义中为它们提供初始化程序。所有其他类型必须在外部定义。
这样做是因为在很大比例的情况下,常量积分值被用作编译时常量,作为程序中的rvalues。它们在实际存储中不需要空间(即不需要物理定义)。同时,编译器可以从了解每个转换单元中的积分常量的值中获益(例如,优化,将整数操作数直接嵌入到机器指令等中)。这不适用于(或适用于更小程度)非 - 整体类型。
您必须在类之外定义静态成员并在那里提供初始化程序。
class example
{
public:
static const int num2 = 5;
static const char num[];
};
const char example::num[] = "test";
请记住,要遵守ODR,必须将成员定义放在一个且只有一个实现文件中。不要尝试将其放入头文件中。