2016-07-01 8 views
0

の控除を使用しています http://www.cplusplus.com/doc/tutorial/ntcs/初期化子-文字列が長すぎる、私はGCC 4.8.5を使用していると私はエラーを取得していますサイズ

状態::私はこれが、このリンクごとにC++での法的なと思いました

class MyClass { 
    char filebase[] = "file name base"; 
public: 
    /* constructor, destructor, functions, none of which use the value */ 
}; 

:それは、クラスの一部だ

「したがって、mywordと呼ばれるchar型の要素の配列は、これら2つのステートメントのいずれかで、文字のnullで終わるシーケンスで初期化することができます:」

char myword[] = { 'H', 'e', 'l', 'l', 'o', '\0' }; 
char myword[] = "Hello"; 

私はここで間違って何をしているのですか?

EDIT:あなたはそれはまだだけデフォルトフィールド初期化子だことを覚えておいてください、クラスの初期化子を指定すると、実際のエラーメッセージを追加し、私のコードの構文を固定は

答えて

3

をsnippiet。コンストラクタはそれをオーバーライドできます。そのため、イニシャライザは配列の長さに何の影響も及ぼさず、なぜこれが機能しないのでしょうか。

打ち鳴らすは、より良い診断を生成します。

error: array bound cannot be deduced from an in-class initializer

それはGCCの拡張機能と競合するため、GCCの診断は非常に混乱している理由があります。あなたは-pedanticオプションGCCを渡す場合は、追加の警告(と再びやや誤解を招く)を取得:

warning: ISO C++ forbids zero-size array 'filebase'

GCCはタイプchar[]のあなたのフィールド定義を受け入れ、それに長さ0を与えています。次に、長さゼロの配列に収まらないため、イニシャライザーを受け入れません。

動作させるには、アレイのサイズを明示的に指定します。

+1

私はgccが何を考えているのかを理解するのに一層役立つ、gcc 6.1の 'class MyClass''に' error:flexible array member 'MyClass :: filebase'を追加しました。 – melpomene

+0

@melpomeneそれははるかに優れた診断です、それが今改善されていることを嬉しく思います。非常に最近の5.3でさえ、OPが示したのと同じ診断を与えた。 – hvd

+0

元のシナリオで 'const char * 'を使う方が適切でしょうか?それは純粋に、クラスインスタンスごとに新しいchar配列を作成するのではなく、メモリ内の他の場所の文字列を指しているからです。 –

関連する問題