2012-11-30 41 views
9

多行原始字符串文字可以作爲預處理器宏的參數嗎?多行原始字符串文字作爲預處理器宏參數

#define IDENTITY(x) x 

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

此代碼不能在g ++ 4.7.2和VC++ 11(Nov.CTP)中編譯。
它是一個編譯器(詞法分析器)的錯誤?

+1

這似乎是要麼詞法分析器或至少在GCC中有預處理器問題。如果我添加預處理器續行(以反斜槓結尾),它會進行編譯,但字符串包含續行字符。使用GCC 4.7.2進行測試。 –

+1

我已經打開了一個bug來跟蹤Visual C++ CTP中的問題。 –

+1

對於它的價值,鏗鏘3.1沒有問題編譯你的例子。 – bfroehle

回答

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

你的第一個例子不會編譯,因爲它是一個普通的字符串。 OP使用原始字符串文字,它可以包含源文件換行符(參見[lex.string],尤其是第4和5段)。我與OP一致認爲這是一個編譯器錯誤。 – Angew