読者です 読者をやめる 読者になる 読者になる

Flat Leon Works

アプリやゲームを作ってます。

【C++ 小ネタ】文字列定数いろいろ

文字列定数とは

"foo" ←これのことです。文字列リテラルとも呼ばれます。

並んだ文字列定数は自動で連結される

複数並んだ文字列定数は、コンパイル前に1つの文字列定数として連結されます。

const char* str = "a" "b"; // "ab"になる
const char* str2 = "c" // 間にコメントや改行があっても連結されます。
"d"
; // "cd"になる

マクロ関数の引数を文字列化する

マクロ関数の引数は#で文字列化することができます。

#define MACRO( param ) #param

MACRO( aaa ) // "aaa"になる

マクロに関してはこちらもご覧ください。

【C++】プリプロセッサの基礎(マクロ編)

複数行の文字列定数を記述する

文字列定数は途中で改行することができません。以下のような記述はコンパイルエラーになります。

printf( "
+----------+\n
|          |\n
|          |\n
|          |\n
|          |\n
+----------+\n
"
);

しかし、並んだ文字列定数は自動で連結されるので以下のように書くことができます。

printf( ""
"+----------+\n"
"|          |\n"
"|          |\n"
"|          |\n"
"|          |\n"
"+----------+\n"
);

各行の頭に"、末尾に\n"を付ける必要があります。

もうちょっと楽できないものか…

できました。行末に\n\を置くだけです!

printf( "\
+----------+\n\
|          |\n\
|          |\n\
|          |\n\
|          |\n\
+----------+\n\
" );

これは、行末に\を置くと改行が無視されるのを利用しています。