在編譯時使用宏和標記串聯在寬字符串和窄字符串之間切換是很常見的。通過串聯創建原始字符串時是否還原了trigraph替換?
#define _T(x) L##x
const wchar_t *wide1 = _T("hello");
const wchar_t *wide2 = L"hello";
而在C++ 11應該是有效炮製與原始字符串類似的事情:
#define RAW(x) R##x
const char *raw1 = RAW("(Hello)");
const char *raw2 = R"(Hello)";
由於轉義序列取代前宏擴展和令牌級聯發生,這應該防止轉義序列在引用的字符串中被替換。
但是這怎麼適用於trigraphs?通過與正常字符串串聯形成的原始字符串是否仍然受到其三字母替換的回覆?
const char *trigraph = RAW("(??=)"); // Is this "#" or "??="?
在編譯器中試用這個程序需要多長時間,而不是在這裏問問題的時間? –
我不想在生產代碼中使用它,我正在編寫一個編譯器,它看起來像是一個邊緣案例。此外,我不知道任何具有完整C++ 0x支持的編譯器(並且我不認爲最終的標準甚至已經發布)。 –
@Damien這不是一個合適的答案......我知道C++編譯器會偏離規範 –