C/C++のヒアドキュメント/複数行文字列【特殊な文字列リテラル】

C言語やC++の文字列リテラルはヒアドキュメント/複数行文字列の実現が可能です。用途別に複数の方法が利用できます。

末尾バックスラッシュ

文字列改行前にバックスラッシュ(\)を置くとコンパイラ側で改行が無視されます。これによってヒアドキュメントの実現が可能となります。ただし、改行コードは自前で挿入する必要があります。

const char *str = "1\
  2\n\
    3";
puts(str); // "1  2\n    3"

隣接文字列の連結

C言語では、隣接する文字列リテラルはコンパイル時に連結されます。これによって複数行文字列を表現することが可能になります。

const char *str = "1"
                  "  2\n"
                  "    3";
puts(str); // "1  2\n    3"

比較的メジャーで認知度も高い言語仕様であるため、C言語でヒアドキュメントを実現する際にはこちらの方法をオススメします。

Raw文字列リテラル

C++の場合はRaw文字列リテラルをヒアドキュメントとして活用することができます。

char const *str = R"(1
  2
  "-"
    3)";
puts(str); // "1\n  2\n  \"-\"\n    3"

ダブルクオーテーションの混在も可能です。Python言語のトリプルダブルクォートを用いたヒアドキュメントに近い挙動をとります。

注意点

複数行の文字列を一つのリテラルとして扱いたい場合には、基本的に# 隣接文字列の連結で紹介した方法を用いることをオススメします。

if (true) {
    const char *s =
        "<ul>\n"
        "  <li>item-1</li>\n"
        "  <li>item-2</li>\n"
        "</ul>\n";
}

その他の方法では、ソースコード側のインデントの影響を受けるため、使い方によっては読みづらいコードになってしまうという欠点があります。

if (true) {
    const char *S = R"(<ul>
  <li>item-1</li>
  <li>item-2</li>
</ul>
)";
}

またソースコードの自動整形機能によって文字列リテラル内のインデントが崩れやすいという特性もあります。

広告