多行原始字符串文字作为预处理程序宏参数

时间:2012-11-30 17:16:01

标签: c++ c++11

多行原始字符串文字是否可以作为预处理器宏的参数?

#define IDENTITY(x) x

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

此代码不能在g ++ 4.7.2和VC ++ 11(Nov.CTP)中编译 它是编译器(词法分析器)的错误吗?

1 个答案:

答案 0 :(得分: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."