C 言語 | 前処理 | 文字列化
関数形式マクロに渡したコードを文字列へ変換する方法を説明する。文字列ではないテキストをマクロに渡し、展開時に文字列へ変換できる。
関数形式マクロと文字列化演算子
関数形式マクロで利用できる前処理演算子には、引数として受け取ったトークン列を文字列へ変換するものがある。トークン列を解析し、引用符を付けた形に展開する。これにより、数値やトークン列を自動的に文字列へ変換するマクロを作成できる。
トークン列を文字列化するには、マクロの引数の前に # 演算子を付ける。
#define TOSTRING(param) #param
これはマクロであるため、param に渡すトークン列の形式は制限されない。# 演算子はどのようなトークン列でも文字列化する。
TOSTRING(1234) → "1234"
TOSTRING(int iValue = 10\n) → "int iValue = 10\\n"
TOSTRING("Kitty") → "\"Kitty\""
この変換はコンパイル前のソーステキストに対して行われる。プログラムの実行時に動的に変換するものではない。文字列化演算子は引用符を \"、バックスラッシュを \\ に変換し、元のトークン列を文字列として保持する。
コード 1
#include <stdio.h>
#define PRINTLN(string) printf(#string "\n")
int main() {
PRINTLN(0xFF);
PRINTLN(Kitty on your lap);
PRINTLN(Kernighan and Ritchie wrote "hello, world\n" on their book.);
return 0;
}
コード 1 の PRINTLN() マクロは、引数を文字列化して printf() で表示する。最後の例には "hello, world\n" というトークンが含まれており、プリプロセッサーによって \"hello, world\\n\" に変換される。そのため、引用符とエスケープシーケンスがそのまま表示される。