多行原始字符串文字可以作爲預處理器宏的參數嗎?多行原始字符串文字作爲預處理器宏參數
#define IDENTITY(x) x
int main()
{
IDENTITY(R"(
)");
}
此代碼不能在g ++ 4.7.2和VC++ 11(Nov.CTP)中編譯。
它是一個編譯器(詞法分析器)的錯誤?
多行原始字符串文字可以作爲預處理器宏的參數嗎?多行原始字符串文字作爲預處理器宏參數
#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之間或as
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."
你的第一個例子不會編譯,因爲它是一個普通的字符串。 OP使用原始字符串文字,它可以包含源文件換行符(參見[lex.string],尤其是第4和5段)。我與OP一致認爲這是一個編譯器錯誤。 – Angew
這似乎是要麼詞法分析器或至少在GCC中有預處理器問題。如果我添加預處理器續行(以反斜槓結尾),它會進行編譯,但字符串包含續行字符。使用GCC 4.7.2進行測試。 –
我已經打開了一個bug來跟蹤Visual C++ CTP中的問題。 –
對於它的價值,鏗鏘3.1沒有問題編譯你的例子。 – bfroehle