2012-11-30 15 views
9

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

#define IDENTITY(x) x 

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

このコードは、g ++ 4.7.2とVC++ 11(Nov.CTP)の両方でコンパイルされません。
コンパイラ(レクサー)のバグですか?複数行のマクロ呼び出しは合法的

+1

そのセクション3.3(マクロの引数)でレクサーのいずれかのようだということ

http://gcc.gnu.org/onlinedocs/cpp.pdf 

状態でCコンパイラのドキュメント

IDENTITY("(\n)"); 

を使用することができなかった場合GCCでは少なくともプリプロセッサの問題が発生します。プリプロセッサの行継続(バックスラッシュで行を終了する)を追加するとコンパイルされますが、文字列には行継続文字が含まれます。 GCC 4.7.2でテストされています。 –

+1

私はVisual C++ CTPの問題を追跡するためにバグをオープンしました。 –

+1

それは価値があるため、Clang 3.1はあなたの例をコンパイルするのに問題はありません。 – bfroehle

答えて

2

- あなたはそれが

をコンパイルしている必要がありリテラル生の文字列を使用しているので、知られているGCCのバグはこのためにあります:あなたがされていた場合は

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52852

通常の(非表示の)文字列を使用すると違法になります。新ラインは、HELLOと世界の間のものである場合、これは

printf("HELLO\nWORLD\n"); 

としてコーディングする必要があります

printf("HELLO 
    WORLD\n"); 

か:

printf(R"HELLO 
    WORLD\n"); 

ではなく、これを:

これは、コンパイルされている必要がありますas

printf("HELLO " 
    "WORLD\n"); 

介入する改行がない場合。

リテラルに新しい行が欲しいですか?そうしてあなたは

"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." 
+3

最初の例は普通の文字列リテラルなのでコンパイルされません。 OPは生の文字列リテラルを使用しました。これはソースファイルの改行を含むことができます([lex.string]、esp。para 4&5参照)。私はそれがコンパイラのバグOPの側にあります。 – Angew

関連する問題