【问题标题】:Initializing a static const array of const strings in C++在 C++ 中初始化 const 字符串的静态 const 数组
【发布时间】:2011-09-26 01:55:13
【问题描述】:

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

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

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

编译时出现错误“标量初始化程序中的多余元素”。我试着让它类型为 const char **,以为我搞砸了第二个 const 位置,但我得到了同样的错误。我做错了什么?

【问题讨论】:

  • 为什么要声明两个指针?
  • 不太确定,但static const char * days[] = { 有帮助吗?或者它会破坏你的字符串吗?
  • 我第二次提姆的问题!
  • @Tim :如果 C 字符串是 char*,则 C 字符串的 C 数组必须是 char**
  • “C 字符串数组是 char** 类型” 不,不是。您将数组与指针混淆了。显然,ildjarn 也是如此。

标签: c++ compiler-errors initialization constants


【解决方案1】:

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

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"};

【讨论】:

  • 其实你可以为 C++11 更新你的答案,所以你可以在类声明中做到这一点。
  • 对于像这些工作日名称这样的一组字符串,您会推荐这样的静态数组吗?这种情况有最佳做法吗?
【解决方案2】:

对于 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

【讨论】:

  • 这很有帮助。您知道 .cpp 文件中的位是必要的根本原因吗?这看起来很奇怪,与典型的 c++ 不同(声明看起来像定义,反之亦然)。我最好的猜测是类内初始化是初始化数组的 elements,而不是数组本身,这就是 .cpp 部分正在做的事情,但我对此没有真正的信心。一般来说,在 C++11 中,我认为可以在任何时候纯粹在类定义中初始化静态 constexpr,所以我不明白为什么 .cpp 部分是必要的。
  • 我相信第一个 const 是多余的。
猜你喜欢
  • 1970-01-01
  • 2013-04-13
  • 2011-04-18
  • 2011-05-04
  • 1970-01-01
  • 2012-12-15
  • 2013-12-23
  • 1970-01-01
  • 2010-09-29
相关资源
最近更新 更多