我的代码中有这个结构:
struct Foo {
// more stuff but not important
char key[];
};
constexpr Foo foo[] = {
{ "something" }
};
并且GCC编译器抛出此错误:
错误:字符数组的初始化字符串太长 [-fpermissive]
任何想法为什么?或者如何解决?
答案 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。这些天你可以将它包装在一个派生的模板实例类中,它实际上将大小调整作为模板参数 - 你可以从推断数组大小的模板函数返回它。然后基本数组合法使用。