我在工作中正在查看一些C ++代码,偶然发现了这样的事情:
char numberlist[5000] =
"{42, 42, 42, 42, 42, 42, 42, 42, 42, \
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, \
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, \\
// A few more lines, all ending in double-backslash
42, 42, 42, 42, 42}";
(内容被编辑以保护它可能意味着什么)。现在,我确实知道一行末尾的单个反斜杠吞下了下面的换行符,基本上是连接两行。但是双反斜杠?
我在这里收到警告:
警告C4129:'':无法识别的字符转义序列
字符串的突出显示在第一个双反斜线的末尾停止(在VS2010中)。可能是反斜杠换行符先被吃掉然后剩下的反斜杠空格被解释为转义序列吗?在这里删除第二个反斜杠是否安全?
答案 0 :(得分:1)
由于双反斜杠在字符串文字中,因此其含义很明确:它解析为字符串中的单个\
字符。
字符串继续使用文字换行符,这使得源语法在语法上不是有效的C ++,这也是语法高亮显示在此时停止的原因。显然,Visual C ++无论如何都允许这样的字符串(就像g ++一样),因此编译成功。
无法识别的字符转义序列的警告显示无关,因为\<newline>
和\\
本身都是有效的转义。
答案 1 :(得分:0)
显然我的预感是正确的,这首先删除反斜杠换行序列,留下反斜杠空格,发出警告并解析为空格。我只是查看调试器以确认字符串本身没有反斜杠。因此,删除第二个反斜杠不会改变代码的含义(并删除警告,或者更确切地说是其中的15个)。