C和C之间的字符串文字差异++; P>正如我所知,在C++ 11之前,字符串文字的处理方式与C和C++几乎完全相同。 现在,我承认C和C++在处理宽字符串文字方面存在差异。
我所能找到的唯一区别是通过字符串文本初始化数组C和C之间的字符串文字差异++; P>正如我所知,在C++ 11之前,字符串文字的处理方式与C和C++几乎完全相同。 现在,我承认C和C++在处理宽字符串文字方面存在差异。,c++,c,string,string-literals,C++,C,String,String Literals,我所能找到的唯一区别是通过字符串文本初始化数组 char str[3] = "abc"; /* OK in C but not in C++ */ char str[4] = "abc"; /* OK in C and in C++. Terminating zero at str[3] */ 和技术上的差异,只在C++中有意义。在C++ “ABC”是代码> const char(4)< /C> >而C中是 char(4)< /C>。但是,C++有一个特殊的规则,允许转换为 const cha
char str[3] = "abc"; /* OK in C but not in C++ */
char str[4] = "abc"; /* OK in C and in C++. Terminating zero at str[3] */
<>和技术上的差异,只在C++中有意义。在C++ <代码>“ABC”<代码>是代码> const char(4)< /C> >而C中是<代码> char(4)< /C>。但是,C++有一个特殊的规则,允许转换为<代码> const char */COD>,然后转到还有其他区别吗?回答您的问题的最佳方法是将其重写为使用“C”或“C++”编译器时编译相同的程序,我假设您使用的是GCC,但其他(正确编写的)编译器工具链应提供类似的结果 首先,我将阐述你提出的每一点,然后我将给出一个提供答案(和证明)的程序
-
正如我所知,在C++ 11之前,字符串文字的处理方式与C和C++几乎完全相同。
-
现在,我承认C和C++在处理宽字符串文字方面有不同之处。
- 你写的其他东西
原始字符串 <> Pc>一个明显的区别是C++的字符串文字是C的超集。具体来说,C++现在支持(在C中),在技术上定义为2.2.15,通常用于HTML和XML,其中“代码>”/代码>经常遇到。 原始字符串允许您在以下格式中指定自己的分隔符(最多16个字符):
R"delimiter(char sequence)delimiter"
这对于通过提供自己的字符串分隔符来避免不必要的转义字符特别有用。以下两个示例分别说明如何避免转义“
和(
):
std::cout << R"(a"b"c")"; // empty delimiter
std::cout << '\n';
std::cout << R"aa(a("b"))aa"; // aa delimiter
// a"b"c"
// a("b")
std::cout在我们其他讨论的上下文中,const char[N]
vschar[N]“禁止/修改代码”是一个巨大的区别。禁止在C++中修改字符串文字的规则是禁止修改<代码> const 对象的规则。你不会发现任何C++特殊情况,比如C规则,特别是禁止在字符串存储的内存中写入代码。代码<代码> char STR(4)=“abc”。“< /CODE >不是赋值,而是初始化。奇怪的是,C++确实有相同的规则。2.145p12。但是它是冗余的,使用<代码> const <代码>类型。当你写“chx x(4)=abc”时,“实际上,你正在从一个(只读部分)const数组复制到一个(基于栈的)非const数组。它的语义等价于“MimcPy(x,abc)”,4;。希望编译器在编译时检查大小并防止溢出。这似乎更多的是关于初始化char
数组的问题,而不是关于字符串文字解释的问题。但遗憾的是,您错过了这个主题。我不同意,我确实准确地回答了这个问题。OP要求提供额外的区别t你正在解释他是如何证明他所说的一切的。所以如果你问我,那就遗漏了主题。OP限制了他的问题的范围
std::cout << R"(a"b"c")"; // empty delimiter
std::cout << '\n';
std::cout << R"aa(a("b"))aa"; // aa delimiter
// a"b"c"
// a("b")