ストリング・リテラル には、 二重引用符で囲まれた連続した文字またはエスケープ・シーケンスが含まれます。
.---------------------. V | >>-+---+--"----+-文字------------+-+--"------------------------>< '-L-' '-escape_sequence-'
接頭部 L のあるストリング・リテラルは、ワイド・ストリング・リテラル です。 接頭部 L のないストリング・リテラルは、通常の、すなわち狭幅ストリング・リテラル です。
狭幅ストリング・リテラルの型は、char 型の配列で、
ワイド・ストリング・リテラルの型は、wchar_t 型の配列です。
狭幅ストリング・リテラルの型は const char の配列で、
ワイド・ストリング・リテラルの型は const wchar_t の配列です。両方の型には、静的ストレージ期間が指定されています。
ストリング・リテラルの例を次に示します。
char titles[ ] = "Handel's ¥"Water Music¥""; char *mail_addr = "Last Name First Name MI Street Address ¥ City Province Postal code "; char *temp_string = "abc" "def" "ghi"; /* *temp_string = "abcdefghi¥0" */ wchar_t *wide_string = L"longstring";
ヌル ('¥0') 文字が、各ストリングに付加されました。 ワイド・ストリング・リテラルに対して、型 wchar_t の値 '¥0' が付加されます。 規則によって、プログラムでは、ヌル文字が検出されると、ストリングの最後と認識されます。
ストリング・リテラル内に含まれている複数のスペースは保存されます。
次の行にストリングを継続するには、 行継続文字 (¥ 記号) と、その後に続く オプションの空白および改行文字 (必要) を使用します。次の例では、ストリング・リテラル second が、コンパイル時のエラーを起こします。
char *first = "This string continues onto the next¥ line, where it ends."; /* compiles successfully. */ char *second = "The comment makes the ¥ /* continuation symbol */ invisible to the compiler."; /* compilation error. */
ストリングを継続する別の方法は、複数の連続ストリングを持つことです。 隣接するストリング・リテラルを連結し、単一のストリングを作成します。 ワイド・ストリング・リテラルと狭幅ストリング・リテラルが相互に隣接する場合、 その結果の振る舞いについては未定義です。 次の例は、このことを示しています。
"hello " "there" /* is equivalent to "hello there" */ "hello " L"there" /* the behavior at the C89 language level is undefined */ "hello" "there" /* is equivalent to "hellothere" */
連結されたストリングの文字は、別個のまま残っています。 例えば、ストリング "¥xab" と "3" は、連結されて "¥xab3" を形成します。 しかし、文字 ¥xab および 3 は、別個のまま残っていて、16 進文字 ¥xab3 を形成するためにマージされることはありません。
ワイド・ストリング・リテラルと狭幅ストリング・リテラルが隣接すると、 その結果はワイド・ストリング・リテラルになります。
連結の後で、各ストリングの終わりに、char 型の '¥0' が付加されます。 C++ プログラムは、この値をスキャンすることによって、ストリング の終わりを検出します。ワイド・ストリング・リテラルに対して、 wchar_t の '¥0' が付加されます。 次に例を示します。
char *first = "Hello "; /* stored as "Hello ¥0" */ char *second = "there"; /* stored as "there¥0" */ char *third = "Hello " "there"; /* stored as "Hello there¥0" */
関連参照