9

複数行の生の文字列リテラルをプリプロセッサ マクロの引数にすることはできますか?

#define IDENTITY(x) x

int main()
{
    IDENTITY(R"(
    )");
}

このコードは、g++4.7.2 と VC++11 (Nov.CTP) の両方ではコンパイルできません。
コンパイラ(レクサー)のバグですか?

4

1 に答える 1

2

複数行のマクロ呼び出しは合法です - 生の文字列リテラルを使用しているため、コンパイルする必要があります

これには既知の 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."
于 2012-11-30T17:26:12.300 に答える