多行原始字符串文字是否可以作为预处理器宏的参数?
#define IDENTITY(x) x
int main()
{
IDENTITY(R"(
)");
}
此代码不能在g ++ 4.7.2和VC ++ 11(Nov.CTP)中编译 它是编译器(词法分析器)的错误吗?
答案 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."