在C++中初始化一个静态常量字符串数组

33

我在初始化一个常量字符串数组时遇到了问题。

这是 week.h 的部分代码(仅显示相关部分):

class Week {
  private:
    static const char *const *days = { "mon", "tue", "wed", "thur",
                                       "fri", "sat", "sun" };
};

编译时我遇到了"scalar initializer中有过多元素"的错误。我尝试将其类型更改为const char **,认为可能是第二个const放置不当,但我仍然收到了相同的错误消息。我做错了什么?


你为什么有两个指针声明? - Tim
2
@Tim:如果一个C字符串是char*,那么一个C字符串数组必须是char** - ildjarn
一个C-字符串数组的类型是char**,我只是没有意识到我不能用那种类型来初始化它。 - Nick
@Nick,@Tim:常量C-String的类型为const char* const - Armen Tsirunyan
1
一个C字符串数组的类型是char **。不,它不是。你把数组和指针搞混了。就像ildjarn一样。 - Lightness Races in Orbit
显示剩余2条评论
2个回答

56

首先,你需要一个数组而不是一个指针。

static const char * const days[] = {"mon", "tue", "wed", "thur",
                                       "fri", "sat", "sun"};

其次,你不能在类定义内直接初始化它。在类定义内,只需留下以下内容:

static const char * const days[]; //declaration

接下来,在 .cpp 文件中编写定义

const char * const Week::days[] = {"mon", "tue", "wed", "thur",
                                       "fri", "sat", "sun"};

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

const char * const days[] = {"mon", "tue", "wed", "thur",
                                       "fri", "sat", "sun"};

7
实际上,你可以更新你关于C++11的答案,这样你就可以在类声明中进行操作。 - Geoffroy
你会推荐像这样的静态数组来存储这些星期几的字符串吗?对于这种情况,有最佳实践吗? - Kyle Delaney

19

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

在你的week.h文件中写入:

class Week {
    public:        
       static const constexpr char* const days[] = 
           { "mon", "tue", "wed", "thur","fri", "sat", "sun" };
};

在你的week.cpp文件中,任意位置编写如下代码:
constexpr const char* const Week::days[];

确保您启用了C++11,例如使用以下命令编译:

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


3
这很有帮助。你知道为什么.cpp文件中的比特是必要的吗?这看起来非常奇怪,不像典型的C++代码(声明和定义貌似颠倒了)。我最好的猜测是,在类内初始化正在初始化数组的元素,但不是数组本身,这就是.cpp部分在做的事情,但我对此并不十分确定。总的来说,在C++11中,我认为可以纯粹在类定义中初始化任何类型的静态constexpr,因此我不明白为什么需要.cpp部分。 - Nir Friedman
1
我认为第一个const是多余的。 - scx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接