我有一个广泛的字面文字:
const wchar_t* charSet = L" !\"#$%&'()*+,-./0123456789:;<=>?\n"
L"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\n"
L"`abcdefghijklmnopqrstuvwxyz{|}~\n";
当我将它传递给文本处理器'\'时(反斜杠)不存在。现在如果我把它改为\\ it
我收到编译时错误:
“缺少收尾报价”
那么如何将反斜杠放入这样的字符串中呢?
答案 0 :(得分:2)
至于您的原始代码
L" !\"#$%&'()*+,-./0123456789:;<=>?\n"
您只是错过了再次转义引号字符"
。添加另一个\
您将获得
L" !\\"#$%&'()*+,-./0123456789:;<=>?\n"
此时未转义的"
关闭了文字。 "
的下一次出现将打开一个新的文字,但它不平衡,因此编译错误信息(你甚至可以在这里的代码标记中发现效果)。您需要再添加\
以再次转义"
:
L" !\\\"#$%&'()*+,-./0123456789:;<=>?\n"
// ^^^ Fix this
但是,管理与\
反斜杠和"
引号字符混合的转义字符非常难以阅读并保持更改。
自最新标准(c++11)起,您可以使用raw character string literals:
#include <iostream>
#include <string>
int main() {
std::wstring ws(LR"del( !\"#$%&'()*+,-./0123456789:;<=>?)del" L"\n"
LR"del(@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_)del" L"\n"
LR"del(`abcdefghijklmnopqrstuvwxyz{|}~)del" L"\n");
std::wcout << ws;
return 0;
}
输出
!\"#$%&'()*+,-./0123456789:;<=>?
@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
`abcdefghijklmnopqrstuvwxyz{|}~
不需要逃避,你知道。