用原始字符串文字返回回车符+换行符?

max*_*zig 4 c++ string gcc rawstring c++11

考虑一个具有UNIX行尾(即'\x0a'而不是"\x0d\x0a")并且包含以下原始字符串文字的C ++文件:

const char foo[] = R"(hello^M
)";
Run Code Online (Sandbox Code Playgroud)

^M实际字节为0x0d(即回车))。

后续字符串比较(考虑标准对原始字符串文字的定义时)应该是什么结果?

strcmp("hello\r\n", foo);
Run Code Online (Sandbox Code Playgroud)

字符串应该相等还是不相等?(即0!=0?)

使用GCC 4.8(在Fedora 19上),它们比较不相等。

这是GCC中的错误或功能吗?

n. *_* m. 5

就标准而言,您只能在字符串文字中(以及程序中的其他位置)使用基本源字符集的成员。程序的物理表示方式如何映射到基本源字符集是实现定义的。

g ++显然认为ASCII \ x0a,ASCII \ x0d和ASCII \ x0d \ x0a都是基本源字符集成员“换行符”的有效表示形式。考虑到希望在Windows,Unix和Mac OS X Classic计算机之间传输源代码以保持其含义,这是完全合理的。