繁体   English   中英

C ++内联初始化静态const char *

[英]C++ inline initialization of a static const char*

为什么我不能在头文件中初始化静态const char *? 在我的代码中,我在我的类头中:

static const char* xml_ID_TAG;

在cpp中:

const char* Class::xml_ID_TAG = "id";

xml_ID_TAG变量包含XML文档的属性字符串。 因为它是静态的,const,原始类型(char *)等...我无法弄清楚为什么编译器禁止编写类似的东西:

static const char* xml_ID_TAG = "id";

我正在使用MSVC2013编译器,给出上面的错误示例:“错误:具有类内初始化程序的成员必须是const”

一般来说,您必须在一个翻译单元中定义静态成员,并且该语言通过禁止您在周围的类定义中为此类成员编写初始化器来帮助强制执行此操作:

struct T
{
   static int x = 42;
   // ^ error: ISO C++ forbids in-class initialization of
   // non-const static member 'T::x'
};

但是,为方便起见,对常量进行了特殊的例外处理:

struct T
{
   static const int x = 42;
   // ^ OK
};

请注意,在大多数情况下,您仍然需要定义常量(在.cpp文件中将是最佳位置):

const int T::x;

[C++11: 9.4.2/3]:]如果非易失性const static数据成员是整数或枚举类型,它在类定义中的声明可以指定一个括号或等于初始化器 ,其中每个初始化器-clause赋值表达式,是一个常量表达式(5.19)。 可以使用constexpr说明符在类定义中声明文字类型的static数据成员; 如果是这样,它的声明应指定一个大括号或等于初始化器 ,其中作为赋值表达式的每个initializer子句都是一个常量表达式。 [注意:在这两种情况下,成员可能会出现在常量表达式中。 -end note]如果在程序中使用odr-used (3.2)并且命名空间作用域定义不包含初始化程序,则仍应在命名空间作用域中定义该成员。


现在,您的成员不是int ,甚至const char* const也不是“整数类型”:

struct T
{
   static const char* const str = "hi";
   // ^ error: 'constexpr' needed for in-class initialization of
   // static data member 'const char* const T::str' of non-integral type
};

但它一个“字面型”; 你的结果是,如果你这样写:

static constexpr const char* const xml_ID_TAG = "id";
//     ^^^^^^^^^             ^^^^^

你应该没问题。 (注意, 在C ++ 17之前您仍然需要定义它 。)

无论如何,这可能更有意义:你为什么要改变指针?

因为它是[...] const ” - 不。

你需要const char* const - 假设你使用的是C ++ 11。

否则,您必须将定义放在cpp文件中。

请参阅: 如何在C ++中初始化静态const成员?

因为字符串文字(例如"id" )是按文件编译单元存储的。 因此,如果它们位于头文件中,则为包含它的每个源文件存储不同的实例。 所以你的'初始化'试图在每个编译单元的static变量中存储不同的值#include s it ..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM