2017-12-12 103 views
1

私は私のコードでは、この構造体があります。文字の配列の初期化子-stringはcharの長すぎる[]

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

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

をし、GCCコンパイラは、このエラーがスローされます。

error: initializer-string for array of chars is too long [-fpermissive]

任意のアイデアを、なぜ?どのように解決できるのか?

+7

'char key [];'にはサイズがありません。どれくらいですか?そして、とにかく、異なるFooは異なるサイズを持つことはできません。 –

+3

char配列の代わりに 'std :: string'を使うべきでしょう。あなたはC言語ではなくC言語で書いています。 –

+0

@mihai popこのエラーを生成するコードを表示します。 –

答えて

1

のために行く必要があります。この標準では、長さゼロの配列を宣言することができますが、それは明白なユースケースのためですが、あなたが望むサイズをどのように割り当てるかについては言及していません。

いくつかのコンパイラは、それを拡張としていくつかの方法でサポートしています。

事前テンプレート日にきれいに行うには、カスタムアロケータ演算子newが必要でした。最近の例では、派生したテンプレートインスタンスクラスにラップすることができます。派生テンプレートインスタンスクラスは、実際にはテンプレート引数としてサイズ設定を行います。配列サイズを推定するテンプレート関数から返すことができます。ベース配列は、その後、使用するのに合法です。

4

この警告では、可変長の変数keyの長さに関する問題が示されています。変数が最後のメンバである限り、このような定義は問題ありません。コンパイラのバージョンとフラグによって、警告またはエラーが発生する可能性があります。私はそれがgccバグとみなされ、hereと記載されていると信じています。

警告が離れて行くようにする最も簡単な修正はそうのようなchar配列のための固定値を置くことです:

struct Foo { 
    char key[10]; 
}; 

constexpr Foo foo[] = { 
    {"something"} 
}; 
std::cout<<foo[0].key; // prints out 'something' 

しかし、もう一つの点に注意してください。 Fooオブジェクトの配列を作成しようとしています。現在の実装では、各オブジェクトの配列長は同じkeyになります。

あなたは、これはオブジェクト間で変更したい場合は、最後の要素の自動サイズ変更は、標準C++ではありませんstd::string

関連する問題