アップデート
これは、「c++ は c blues ではない」という単なる別のケースであることが判明しました。
私が欲しいもの
const char hex[16] = "0123456789ABCDEF";
機能する唯一のもの
char hex[16] = "0123456789ABCDE"; hex[15] = "F";
gccコンパイラで文字列をnullで終了させないようにするためにできるコンパイラオプションや何かがありますか。(n)定数配列を作成できるように
これは、「c++ は c blues ではない」という単なる別のケースであることが判明しました。
私が欲しいもの
const char hex[16] = "0123456789ABCDEF";
機能する唯一のもの
char hex[16] = "0123456789ABCDE"; hex[15] = "F";
gccコンパイラで文字列をnullで終了させないようにするためにできるコンパイラオプションや何かがありますか。(n)定数配列を作成できるように
コンパイラ オプションは必要ありません。すでに非 NUL で終了しています。標準では、NUL は収まる場合にのみ追加する必要があり、そうでない場合はオーバーフローになると規定されています。配列を過ぎたメモリ内の次のバイトが\0
§ 6.7.8p14
文字型の配列は、文字列リテラルによって初期化することができ、オプションで中括弧で囲みます。文字列リテラルの連続する文字 (空きがある場合、または配列のサイズが不明な場合は、終端の null 文字を含む) は、配列の要素を初期化します。
いいえ。NUL で終わる文字列は言語固有のものです。ただし、文字配列を使用して、各文字を 1 つずつ設定できます。
char hex [] = {'0', '1', '2', ... 'F'};
あなたはあなた自身の質問に答えました。次のように、配列に明示的に長さを指定した場合:
const char hex[16] = "0123456789ABCDEF";
もちろん、ヌル終了用に予約されたストレージがないため、ヌル終了にはなりません。(hex[16]
オブジェクトの境界外にあるため、読み取りまたは書き込みは未定義の動作です。0として読み取られた場合、それはUB for ya ...)
次のように、長さを暗黙的に残した場合のみです。
const char hex[] = "0123456789ABCDEF";
または、文字列リテラルを初期化子としてではなくオブジェクトとして使用する場合は、nullで終了します。
ちなみに、ヌル終了を使用する予定がないのに、ヌル終了があるかどうかを気にするのはなぜですか。バイナリからバイトを削り取ろうとしていますか?:-)
私は質問が少し不明確だと思います.Cでは、クォートされた初期化:
static const char hex[16] = "0123456789ABCDEF";
合法です。C++ では、そうではありません。したがって、C から C++ に移行するときに (幸いなことにコンパイル時に) 失敗するコードの 1 つです。
文字列リテラルを終了 \0 バイトなしで強制する方法があると便利です。何かのようなもの:
static const char hex[16] = "0123456789ABCDEF\!0";
\!0
末尾の は、文字列をゼロで終了しないようにコンパイラに指示します! \!
または\!0
文字列の他の場所でも変更されずに動作するため、リテラル!
または!0
.
C では、文字列は null で終了します。null で終了しない char 配列を設定する場合は、配列初期化子を使用できます。