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)
#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:更加关注不断生成(和可移植性)。
答案是否定的。它是一个无效的 C 程序和未指定行为的C++ 程序。
\n\n说它在语法上是错误的(强调是我的),它不会产生有效的令牌,因此该程序无效:
\n\n\n\n\n5.2.1 字符集
\n\n2/在字符常量或字符串文字中,执行字符集的成员应由源字符集的相应成员或由反斜杠 \\ 后跟一个或多个字符组成的转义序列表示。
\n\n6.4.4.4 字符常量
\n\n3/ \n 单引号 \'、双引号 "、问号 ?、反斜杠 \\ 和任意整数值可根据下表的转义序列表示:
\n\n\n
\n\n- 单引号 \'
\n\\\'- 双引号“
\n\\"- 问号?
\n\\?- 反斜杠 \\
\n\\\\- 八进制字符
\n\\octal digits- 十六进制字符
\n\\xhexadecimal digits8/此外,不在基本字符集中的字符可以用通用字符名来表示,某些非图形字符可以用转义序列来表示,转义序列由反斜杠 \\ 后跟一个小写字母组成: \\a, \\b 、\\f、\\n、\\r、\\t 和 \\v。注意:如果反斜杠后面有任何其他字符,则结果不是标记,需要进行诊断。
\n
不同的说法(强调是我的):
\n\n\n\n\n5.13.3 字符文字
\n\n7/某些非图形字符,单引号 \xe2\x80\x99、双引号 "、问号 ?,25 和反斜杠 \\,可以根据表 8 表示。双引号 " 和问题标记 ? 可以单独表示,也可以分别用转义序列 \\" 和 \\? 表示,但单引号 \xe2\x80\x99 和反斜杠 \\ 应由转义序列 \\\xe2\x80 表示分别为 \x99 和 \\。表 8 中未列出反斜杠后面的字符的转义序列是有条件支持的,具有实现定义的语义。转义序列指定单个字符。
\n
因此,对于 C++,您需要查看编译器手册以了解语义,但该程序在语法上是有效的。
\n| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |