无用的反斜杠会产生定义明确的字符串常量吗?

Wol*_*olf 6 c c++ portability escaping string-literals

既,C和C ++,支持看似等效集等转义序列\b\t\n\"和开始与反斜线字符他人(\)。如果跟随正常字符,如何处理反斜杠?据我从几个编译器中记得,转义字符\被默默地跳过。在 cppreference.com 上,我阅读了这些文章

我只找到了这个关于孤儿反斜杠的注释(在 C 文章中)

如果反斜杠后跟此处未列出的任何字符,则 ISO C 需要诊断:[...]

以上参考表。我还看了一些在线编译器

演示

#include <stdio.h>

int main(void) {
    // your code goes here
    printf("%d", !strcmp("\\ x", "\\ x"));
    printf("%d", !strcmp("\\ x", "\\\ x"));
    printf("%d", !strcmp("\\ x", "\\\\ x"));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

C++ 演示

#include <iostream>
#include <string>
using namespace std;

int main() {
    cout << (string("\\ x") == "\\ x");
    cout << (string("\\ x") == "\\\ x");
    cout << (string("\\ x") == "\\\\ x");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

通过语法突出显示处理"\\ x""\\\ x"等效(某种)警告。IOW"\\\ x"已转化为"\\ x".

我可以假设这是定义的行为吗?

澄清(编辑)

  • 不是在问"\".
  • 知道孤儿反斜杠有点问题。
  • 我想知道编译器构建的常量结果是否已定义

编辑 #2:更加关注不断生成(和可移植性)。

Jea*_*nès 4

答案是否定的。它是一个无效的 C 程序和未指定行为的C++ 程序。

\n\n

C标准

\n\n

说它在语法上是错误的(强调是我的),它不会产生有效的令牌,因此该程序无效:

\n\n
\n

5.2.1 字符集

\n\n

2/在字符常量或字符串文字中,执行字符集的成员应由源字符集的相应成员或由反斜杠 \\ 后跟一个或多个字符组成的转义序列表示。

\n\n

6.4.4.4 字符常量

\n\n

3/ \n 单引号 \'、双引号 "、问号 ?、反斜杠 \\ 和任意整数值可根据下表的转义序列表示:

\n\n
    \n
  • 单引号 \'\\\'
  • \n
  • 双引号“\\"
  • \n
  • 问号?\\?
  • \n
  • 反斜杠 \\\\\\
  • \n
  • 八进制字符\\octal digits
  • \n
  • 十六进制字符\\xhexadecimal digits
  • \n
\n\n

8/此外,不在基本字符集中的字符可以用通用字符名来表示,某些非图形字符可以用转义序列来表示,转义序列由反斜杠 \\ 后跟一个小写字母组成: \\a, \\b 、\\f、\\n、\\r、\\t 和 \\v。注意:如果反斜杠后面有任何其他字符,则结果不是标记,需要进行诊断

\n
\n\n

C++标准

\n\n

不同的说法(强调是我的):

\n\n
\n

5.13.3 字符文字

\n\n

7/某些非图形字符,单引号 \xe2\x80\x99、双引号 "、问号 ?,25 和反斜杠 \\,可以根据表 8 表示。双引号 " 和问题标记 ? 可以单独表示,也可以分别用转义序列 \\" 和 \\? 表示,但单引号 \xe2\x80\x99 和反斜杠 \\ 应由转义序列 \\\xe2\x80 表示分别为 \x99 和 \\。表 8 中未列出反斜杠后面的字符的转义序列是有条件支持的,具有实现定义的语义。转义序列指定单个字符。

\n
\n\n

因此,对于 C++,您需要查看编译器手册以了解语义,但该程序在语法上是有效的。

\n

  • 语法不允许这样的转义序列,因此程序无效。 (3认同)
  • “有条件支持,具有实现定义的语义”不是“未指定”。 (3认同)