複数行の生の文字列リテラルをプリプロセッサ マクロの引数にすることはできますか?
#define IDENTITY(x) x
int main()
{
IDENTITY(R"(
)");
}
このコードは、g++4.7.2 と VC++11 (Nov.CTP) の両方ではコンパイルできません。
コンパイラ(レクサー)のバグですか?
複数行のマクロ呼び出しは合法です - 生の文字列リテラルを使用しているため、コンパイルする必要があります
これには既知の GCC バグがあります。
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52852
通常の (生ではない) 文字列を使用していた場合、それは違法でした。
これはコンパイルされているはずです:
printf(R"HELLO
WORLD\n");
しかし、これではありません:
printf("HELLO
WORLD\n");
これは次のようにコーディングする必要があります。
printf("HELLO\nWORLD\n");
HELLO と WORLD の間、または
printf("HELLO "
"WORLD\n");
介在する改行が意図されていない場合。
リテラルに新しい行が必要ですか? もしそうなら、あなたは使うことができませんでした
IDENTITY("(\n)");
にある C コンパイラのドキュメント
http://gcc.gnu.org/onlinedocs/cpp.pdf
セクション 3.3 (マクロ引数) で次のように述べています。
"The invocation of the macro need not be
restricted to a single logical line—it can cross
as many lines in the source file as you wish."