実際char const* const presets[] = { ... };
、文字列リテラルで初期化されましたか? つまり、あなたが と言うとき
char const* presents[150]
、これは誰かが 2 番目の を忘れたからなのかconst
、それとも後でポインタを実際に変更したからなのかということです。そして、誰かが実際にイニシャライザを数えて中かっこに数字を入れ、イニシャライザを追加または削除するたびにこの数を更新したためですか、それともイニシャライザを少なくして初期化される末尾の値を数えたためですかnullポインタ?何をしようとしているのかを正確に把握していなければ、適切な推奨事項を提供することは困難です。
私が遭遇した最も頻繁なケースでは、すべてが const であり、配列のサイズが初期化子の数に正確に対応することが本当に必要な場合、最善の解決策はおそらくそのままにしておくことです。配列の自動サイズ設定を取得するには、C スタイルの配列を使用するか、または (C++11 のみ) を使用する必要がありますstd::vector
。
std::array
要素数を明示的に指定する必要があります。そして、真に静的な初期化を取得するには (したがって
、初期化の問題の順序のリスクがまったくない)、C スタイルの配列 または のいずれかが必要です(どちらのstd::array
場合も
ではchar const*
なくstd::string
、動的な初期化が必要です)。
char const*
not を使用すると、std::string
アクセスするたびに (通常)、 new を作成することになることに注意してくださいstd::string
。実装によっては、これにより追加のランタイム オーバーヘッドが発生する場合があります。通常、これは問題ではありませんが、考慮する必要がある場合もあります。std::string
他の静的オブジェクトのコンストラクターからオブジェクトを使用する場合、使用するとアドレスが必要な初期化の問題の順序が発生するという事実と比較検討する必要があります。