3

我在工作中查看了一些 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 中)。会不会是反斜杠换行符首先被吃掉,然后剩余的反斜杠空格被解释为转义序列?在这里删除第二个反斜杠是否安全?

4

2 回答 2

1

由于双反斜杠在字符串文字内,其含义很明确:它解析为字符串中的单个\字符。

字符串以文字换行符继续,这使得源代码在语法上不是有效的 C++,这也是语法突出显示在该点停止的原因。显然 Visual C++ 无论如何都允许这样的字符串(就像 g++ 一样),所以编译成功。

无法识别的字符转义序列的警告似乎无关,因为两者\<newline>\\本身都是有效的转义。

于 2013-11-12T12:50:01.147 回答
0

显然我的预感是正确的,这首先删除了反斜杠换行序列,它留下了反斜杠空格,它发出警告并解析为一个空格。我只是查看了调试器以确认字符串本身没有反斜杠。因此删除第二个反斜杠不会改变代码的含义(并且会删除警告,或者更确切地说是其中的 15 个左右)。

于 2013-11-12T14:35:33.037 回答