それが正しいC ++かどうか知りたい:
static char *arrayExample[] =
{
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h"
};
C++でそれを書くのが正しいかどうか知りたい
static char *arrayExample[] =
{
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h"
};
const
修飾子を追加しなくてもコンパイルできますか? はい、しかしそれは誤解を招きます。文字列リテラルは、ソースコードのすべての文字列リテラルが保存されているメモリ領域に次々と格納されます。これは、それをいじってはならないことを意味します (PC では発生しませんが、ROM メモリにマップされる可能性があります)。
したがって、基本的には正しいです。ただし、このリテラルの配列は変更することを意図していないため、次のように書き換える必要があります。
static const char *arrayExample[] =
{
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h"
};
これはstatic
、それ自体の翻訳単位 (つまり、それが作成されたまさに cpp ファイル) でのみ表示されることを意味します。それが意図したものであれば (翻訳単位間で共有できるようにするつもりはありませんでした)、まったく問題ありません。
お役に立てれば。
コンパイラでコンパイルしようとすると-Wall
、警告が表示されます
警告: 文字列定数から 'char*' への非推奨の変換</p>
「x」定数文字列の配列は配列の初期化を行いますが、宣言は
static char *
これは間違いではありませんが、次のように配列の項目を変更しようとする場合があります。
*arrayExample[2] = 'x'; // runtime error / crash / undefined behavior
constを追加すると、コンパイラの警告が削除され、読み取り専用の値を上書きするコードを記述できなくなります。このコードはコンパイルされますが、実行時にクラッシュします。配列の項目のconst
1 つを上書きしようとすると、コンパイラはエラー (警告ではない) で停止します。char *
static const char *