在C++中初始化const字符串的静态const数组

Nic*_*ick 29 c++ compiler-errors initialization const

我在初始化常量字符串的常量数组时遇到问题.

从week.h(仅显示相关部分):

class Week {
  private:
    static const char *const *days = { "mon", "tue", "wed", "thur",
                                       "fri", "sat", "sun" };
};
Run Code Online (Sandbox Code Playgroud)

当我编译时,我得到错误"标量初始化器中的多余元素".我试着把它变成const char**,认为我弄乱了第二个const位置,但是我得到了同样的错误.我究竟做错了什么?

Arm*_*yan 52

首先,您需要一个数组,而不是指针.

static const char * const days[] = {"mon", "tue", "wed", "thur",
                                       "fri", "sat", "sun"};
Run Code Online (Sandbox Code Playgroud)

其次,您不能直接在类定义中初始化它.我喜欢这个类定义,只留下这个:

static const char * const days[]; //declaration
Run Code Online (Sandbox Code Playgroud)

然后,在.cpp文件中,编写定义

const char * const Week::days[] = {"mon", "tue", "wed", "thur",
                                       "fri", "sat", "sun"};
Run Code Online (Sandbox Code Playgroud)

更新C++ 11 现在您可以直接在类定义中初始化成员:

const char * const days[] = {"mon", "tue", "wed", "thur",
                                       "fri", "sat", "sun"};
Run Code Online (Sandbox Code Playgroud)

  • 实际上你可以更新你的C++ 11的答案,所以你可以在类声明中做到这一点. (7认同)

mar*_*rni 17

对于C++ 11,您可以.h文件中的类声明中进行初始化.但是,您还需要在.cpp文件中包含constexpr .上述案例示例:

在你的week.h文件中,写下:

class Week {
    public:        
       static const constexpr char* const days[] = 
           { "mon", "tue", "wed", "thur","fri", "sat", "sun" };
};
Run Code Online (Sandbox Code Playgroud)

在你的week.cpp文件中,写一下:

constexpr const char* const Week::days[];
Run Code Online (Sandbox Code Playgroud)

确保启用C++ 11,例如编译

g ++ -std = c ++ 11 week.cpp

  • 这非常有帮助.你知道为什么.cpp文件中的位是必要的根本原因吗?这看起来很奇怪,与典型的c ++不同(声明看起来像一个定义,反之亦然).我最好的猜测是,类内初始化正在初始化数组的*elements*,而不是数组本身,这就是.cpp部分正在做的事情,但我对此没有真正的信心.通常在C++ 11中,我认为可以在类定义中初始化静态constexpr,因此我不明白为什么.cpp部分是必要的. (3认同)