字符数组的初始化字符串对于char []来说太长了

时间:2017-12-12 10:30:09

标签: c++ arrays c++11 constexpr

我的代码中有这个结构:

struct Foo {
    // more stuff but not important
    char key[];
};

constexpr Foo foo[] = {
    { "something" }
};

并且GCC编译器抛出此错误:

  

错误:字符数组的初始化字符串太长   [-fpermissive]

任何想法为什么?或者如何解决?

2 个答案:

答案 0 :(得分:4)

警告显示mvn clean install -P build-modules-test -Dmaven.test.skip=true变量存在问题,该变量是一种灵活类型(就长度而言)。只要变量是最后一个成员,这样的定义就可以了。根据您的编译器版本和标志,这可能是警告或错误。我认为它被认为是一个gcc bug并描述了here

使警告消失的最简单方法是为char数组添加一个固定值,如下所示:

key

然而,请注意另外一件事。您正在尝试创建struct Foo { char key[10]; }; constexpr Foo foo[] = { {"something"} }; std::cout<<foo[0].key; // prints out 'something' 个对象的数组。在当前的实现中,这意味着每个对象将具有相同的Foo数组长度。

如果您希望在对象之间进行更改,则应选择key

答案 1 :(得分:1)

最后一个元素的自动调整大小不是标准的c ++。该标准允许您声明零长度数组,并且它是针对明显的用例,但没有说明如何为其分配所需的大小。

有些编译器在某些方面确实支持它作为扩展。

要在模板前的日子里干净利落,需要自定义分配器操作符new。这些天你可以将它包装在一个派生的模板实例类中,它实际上将大小调整作为模板参数 - 你可以从推断数组大小的模板函数返回它。然后基本数组合法使用。