Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C和C之间的字符串文字差异++; P>正如我所知,在C++ 11之前,字符串文字的处理方式与C和C++几乎完全相同。 现在,我承认C和C++在处理宽字符串文字方面存在差异。_C++_C_String_String Literals - Fatal编程技术网

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>,然后转到char */Cord>,直到C 11 +不再使用C++规则时,保持C兼容性。 以及允许的文字长度的差异。然而,作为一个实际问题,编译C和C++代码的编译器都不会强制C下限。 我有一些有趣的链接:


还有其他区别吗?

回答您的问题的最佳方法是将其重写为使用“C”或“C++”编译器时编译相同的程序,我假设您使用的是GCC,但其他(正确编写的)编译器工具链应提供类似的结果

首先,我将阐述你提出的每一点,然后我将给出一个提供答案(和证明)的程序

    正如我所知,在C++ 11之前,字符串文字的处理方式与C和C++几乎完全相同。
仍然可以使用不同的命令行参数以相同的方式处理它们,在本例中,我将使用“-fpermissive”(一个欺骗)。你最好弄清楚为什么会收到警告,并编写新代码来避免任何警告;只使用CLP“作弊”来编译旧代码

正确编写新代码(没有欺骗,没有警告,没有错误是不言而喻的)

    现在,我承认C和C++在处理宽字符串文字方面有不同之处。
不必有(很多差异),因为你可以根据具体情况骗走大部分或全部差异。作弊是错误的,要学会正确编程并遵循现代标准,而不是过去的错误(或尴尬)。事情是以某种方式完成的,在某些情况下对您和编译器都有帮助(请记住,您不是唯一一个“看到”您的代码的人)

这种情况下,编译器需要分配足够的空间以“0”(零字节)结束字符串。它允许在不指定字符串长度的情况下使用打印(和其他一些)函数

如果您只是试图编译从某个地方获得的现有程序,而不想重新编写它,那么您只需要编译并运行它,然后使用欺骗(如果必须)绕过警告并强制编译为可执行文件

  • 你写的其他东西
没有

请参见此示例程序。我稍微修改了你的问题,使之成为一个程序。使用“C”或“C++”编译器编译此程序的结果是相同的

将下面的示例程序文本复制并粘贴到一个名为“test.c”的文件中,然后按照开头的说明进行操作。只需“cat”该文件,这样您就可以在不打开文本编辑器的情况下对其进行反循环(并查看),然后复制并粘贴从编译器命令开始的每一行(接下来的三行)

请注意,正如注释中指出的,运行此行“g++-S-o test_c++.S test.c”会产生错误(使用现代的g++编译器),因为容器的长度不足以容纳字符串

你应该能够阅读这个程序,实际上不需要编译它来查看答案,但是如果你想这样做,它会编译并生成输出供你检查

如您所见,变量“str1”的长度不足以在字符串以null结尾时保存该字符串,这会在现代(且正确编写的)g++编译器上产生错误


原始字符串 <> 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]
vs
char[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")