C++ 字符数组的初始值设定项字符串太长(使用大小推断)

C++ 字符数组的初始值设定项字符串太长(使用大小推断),c++,gcc,C++,Gcc,我使用的是gcc 4.8.5,我得到的错误是: error: initializer-string for array of chars is too long [-fpermissive] char filebase[] = "file name base"; ^ 此代码段来自一个私有字符数组,它是类的一部分: class MyClass { char filebase[] = "file name base"; public: /

我使用的是gcc 4.8.5,我得到的错误是:

error: initializer-string for array of chars is too long [-fpermissive]
  char filebase[] = "file name base";
                    ^
此代码段来自一个私有字符数组,它是类的一部分:

class MyClass {
    char filebase[] = "file name base";
public:
    /* constructor, destructor, functions, none of which use the value */
};
我认为C++中的每一个链接都是合法的:

其中指出:

因此,名为myword的字符元素数组可以通过以下两条语句中的任意一条用以null结尾的字符序列初始化:

我做错了什么


编辑:添加了实际的错误消息并修复了my code snippiet中的语法。当您在类中指定初始化器时,请记住,这仍然只是默认的字段初始化器。构造函数可以重写它。这就是为什么初始化器不能对数组的长度产生任何影响,也就是为什么它不能工作

叮当声产生了更好的诊断:

错误:无法从类内初始值设定项推断数组绑定

GCC的诊断之所以如此混乱,是因为它与GCC扩展冲突。如果您将
-pedantic
选项传递给GCC,则会收到一条额外的警告(并且有点误导):

警告:ISO C++禁止零大小数组的文件基础< /P> GCC正在接受您的字段定义类型
char[]
,并为其指定长度
0
。然后它不接受您的初始化器,因为它不适合于零长度数组


要使其正常工作,请明确指定数组的大小。

在类中指定初始化器时,请记住这仍然只是默认的字段初始化器。构造函数可以重写它。这就是为什么初始化器不能对数组的长度产生任何影响,也就是为什么它不能工作

叮当声产生了更好的诊断:

错误:无法从类内初始值设定项推断数组绑定

GCC的诊断之所以如此混乱,是因为它与GCC扩展冲突。如果您将
-pedantic
选项传递给GCC,则会收到一条额外的警告(并且有点误导):

警告:ISO C++禁止零大小数组的文件基础< /P> GCC正在接受您的字段定义类型
char[]
,并为其指定长度
0
。然后它不接受您的初始化器,因为它不适合于零长度数组


要使其正常工作,请明确指定数组的大小。

我得到了
错误:gcc 6.1中的一个空“class MyClass”中的灵活数组成员“MyClass::filebase”
,这对于了解gcc的想法更为有用。@melpomene这是一个更好的诊断,很高兴看到它现在得到了改进。即使是5.3(相当新的版本)仍然给出了OP显示的相同诊断。对于原始场景,使用
const char*
是否更合适?因为这将纯粹指向内存中其他地方的字符串,而不是为每个类实例创建一个新的字符数组。@MitchLaskis这取决于您想对字符串做什么,但这是一个选项。这不允许您修改字符串内容,允许您更改指针以指向其他字符串,但不允许您(至少不容易)使用自动管理的生存期存储动态构造的字符串。@MitchLaskis,如果您不需要修改它,您也可以将数组设置为静态的。
错误:gcc 6.1中的一个空的“类MyClass”
中有一个灵活的数组成员“MyClass::filebase”,这对于了解gcc的想法更有用。@melpomene这是一个更好的诊断,很高兴看到它现在得到了改进。即使是5.3(相当新的版本)仍然给出了OP显示的相同诊断。对于原始场景,使用
const char*
是否更合适?因为这将纯粹指向内存中其他地方的字符串,而不是为每个类实例创建一个新的字符数组。@MitchLaskis这取决于您想对字符串做什么,但这是一个选项。这不允许您修改字符串内容,允许您更改指针以指向其他字符串,但不允许您(至少不容易)使用自动管理的生存期存储动态构造的字符串。@MitchLaskis,如果您不需要修改它,您也可以将数组
设置为静态
(我认为)。
char myword[] = { 'H', 'e', 'l', 'l', 'o', '\0' };
char myword[] = "Hello";