C 和 C++ 之间的字符串文字差异

2023-12-24

据我所知,在 C++11 之前,C 和 C++ 之间的字符串文字处理方式几乎完全相同。

现在,我承认 C 和 C++ 在处理宽字符串文字方面存在差异。

我发现的唯一区别在于通过字符串文字初始化数组。

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" is const char [4]而在C中则是char [4]。然而,C++ 有一个特殊的规则,允许转换为const char *然后到char *当不再应用该特殊规则时,保留 C 兼容性直到 C++11。

以及允许的文字长度的差异。然而,实际上,任何编译 C 和 C++ 代码的编译器都不会强制执行 C 下限。

我有一些有趣的链接:

  • http://david.tribble.com/text/cdiffs.htm http://david.tribble.com/text/cdiffs.htm
  • http://www.coding-guidelines.com/cbook/c90c++.pdf http://www.coding-guidelines.com/cbook/c90c++.pdf

有没有other差异?


原始字符串

一个显着的区别是 C++ 的字符串文字是 C 字符串文字的超集。具体来说,C++ 现在支持原始字符串 http://www.stroustrup.com/C++11FAQ.html#raw-strings (不支持 http://coliru.stacked-crooked.com/a/bfe6aad38cd69d73在 C) 中,技术上定义于 §2.14.15,通常用于 HTML 和 XML,其中"是经常遇到的。

原始字符串允许您以以下形式指定自己的分隔符(最多 16 个字符):

R"delimiter(char sequence)delimiter"

这对于通过提供您自己的字符串分隔符来避免不必要的转义字符特别有用。以下两个示例展示了如何避免转义" and (分别:

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")

Live demo http://coliru.stacked-crooked.com/a/1bfb25b515e5d92c


char vs const char

注释中指出的另一个区别是字符串文字具有类型char [n]在 C 中,如 §6.4.5/6 中所规定:

对于字符串文字,数组元素的类型为 char,并使用多字节字符序列的各个字节进行初始化。

而在 C++ 中它们有类型const char [n],如 §2.14.5/8 中定义:

普通字符串文字和 UTF-8 字符串文字也称为窄字符串文字。一个箭头 字符串文字的类型为“array of n const char”,其中 n 是字符串的大小(如下定义),并且具有 静态存储持续时间(3.7)。

这并没有改变这样一个事实:在两个标准(分别针对 C 和 C++ 的 §6.4.5/7 和 2.14.5/13)中,尝试修改字符串文字会导致未定义的行为。


未指定与定义的实现(ref https://stackoverflow.com/questions/2397984/undefined-unspecified-and-implementation-defined-behavior)

另一个微妙的区别是,在 C 中,字符串文字的字符数组是否不同是未指定的,根据 §6.4.5/7:

如果这些数组的元素具有适当的值,则未指定这些数组是否不同。

而在 C++ 中,这是根据 §2.14.5/13 定义的实现:

所有字符串文字是否不同(即存储在不重叠的对象中)是由实现定义的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 和 C++ 之间的字符串文字差异 的相关文章

随机推荐

  • 带有访客组件的父子组件树

    在 Angular 2 中 我有一个组件层次结构 然而 在树中 我需要显示另一个与对象层次结构分离的元素 它将是一个旋转器组件 不知怎的 它不想出现
  • 如何找到最大的轮廓?

    我写了一个脚本python它利用了max 方法 我试图在 C 中重新创建一个类似的程序 但我无法获取掩模中最大轮廓的值 我尝试过使用最大元素 C 中的算法库中的函数但无济于事 我还尝试取消引用迭代器 但收到一系列错误 这是我的代码 if c
  • SwiftUI 矩形中的对角线 LinearGradient

    问题 我正在尝试在 SwiftUI 中渲染矩形形状的对角线性渐变 我实现了一个标准的多站线性渐变 当渲染为正方形时它工作得很好 但是当我将框架更改为矩形时 它有一些奇怪的行为 并且看起来更水平 或者有一些奇怪的剪裁 Code struct
  • C# - GC.GetTotalMemory() 问题

    我正在创建一个基于 C 的 Windows 服务 该服务将连续几个月 24x7 运行 我希望能够跟踪我的服务的一般内存使用情况 它不需要精确到字节 分配的一般金额就足够了 我将监视内存消耗的趋势 GC GetTotalMemory 是监视此
  • java.net.SocketException:软件导致连接中止:套接字写入错误[重复]

    这个问题在这里已经有答案了 我正在创建一个应用程序来发送带有附件的邮件 当我附加一个小的 zip 文件时 它工作正常 但是当我附加一个较大的 gt 1mb zip 文件时 它返回错误 java net SocketException 软件导
  • 使用默认值注释模型上的属性

    我创建了一个 EF4 1 代码优先模型 可能重要也可能不重要 并且我正在尝试获取 创建脚手架 模板的默认值 我的模型看起来像 class Person DefaultValue 18 public int Age get set 然后我的创
  • 自动递增跳过数字?

    注意 我是数据库和 PHP 新手 我有一个order设置为的列auto increment and unique 在我的 PHP 脚本中 我使用 AJAX 来获取新数据 但问题是 order跳过数字并且明显更高 因此迫使我在插入数据时手动更
  • 使用 PHP 删除编码

    我有以下文字 We 27re 20proud 20to 20introduce 20the 20Amazing 我想使用 PHP 删除编码 但是使用html entity decode 不起作用 有什么建议么 echo urldecode
  • JavaScript 中的布尔对象对于“false”参数返回 true

    我有一个小问题 我的 ajax 调用会返回一个字符串 有时该字符串是 假 我想始终将该字符串值转换为布尔值 我尝试过 新布尔值 thatValue 但即使参数为 false 它也会返回 true 有办法解决这个问题吗 除了我编写自己的自定义
  • 与加密流相比,DRM 的附加值是多少?

    这个问题是关于使用 MPEG DASH 和 或 HLS 的视频流 我试图了解商业 DRM 系统 例如 EZDRM BuyDRM 等 与简单的加密流媒体 例如 DRM 相比的附加值 AES 128 加密的 HLS 我对商业口号有点迷失了 因此
  • 创建具有最小高度的自定义 AppBarLayout 子项?

    我想创建一个自定义视图 它将成为 AppBarLayout 的子视图 我需要这个视图在向上滚动时部分折叠 但不是完全折叠 它将有一个最小高度 并在小尺寸模式下固定在 AppBarLayout 的顶部 然后当视图向下滚动时扩展到大尺寸模式 我
  • 指定一列的外键和另一列的值

    我有一张桌子ASSETS其结构如下所示 ID PK DESCRIPTION TYPE Do Do Dx Dx TYPE列有一个外键 可能的值为SECURITY or CURRENCY i e FX 我还有两张桌子 CURRENCIES 例如
  • nosql 数据库 - 这些有什么用? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • “整数常量太大,以致于它是无符号的”编译器警告理由

    以下 C C 代码 long long foo 9223372036854775808LL 2 63 编译 g 并带有警告 整数常量太大 以至于它是无符号的 clang 给出了类似的警告 感谢这个错误报告 https gcc gnu org
  • 如何安装旧版本的composer [重复]

    这个问题在这里已经有答案了 我想安装旧版本的作曲家 我的命令是 php r copy https getcomposer org installer composer setup php php r if hash file sha384
  • PHP/MySQL 插入行然后获取“id”

    当我插入一行时 表的 id 字段会自动增加 我想插入一行然后获取该 ID 我会按照我说的那样做 但是有没有一种方法可以让我不用担心插入行和获取 id 之间的时间呢 我知道我可以在数据库中查询与输入的信息相匹配的行 但是变化很大 会有重复项
  • 如何将随机电话号码从数字转换为字典中的单词以及如何从文本中选择它并在Python中将其转换?

    我正在尝试使用以下代码使用字典将随机电话号码从数字转换为单词 dict 1 07 zero seven dict 2 2 two 3 three 4 four 5 five 6 six 7 seven 8 eight dict 3 0 ze
  • Spring Boot 无法读取 Docker 中的 application.properties

    Spring Boot 在 Docker 容器中运行时不会读取应用程序属性 My 应用程序 yml server port 8080 context path mail custom greeting Hello YML Dockerfil
  • Django:FloatField 上的 ORDER BY DESC 将空值置于顶部?

    我很惊讶地发现 Django 中 FloatField 上的 ORDER BY DESC 查询返回的空字段高于具有正值的字段 In models py class City models Model name models CharFiel
  • C 和 C++ 之间的字符串文字差异

    据我所知 在 C 11 之前 C 和 C 之间的字符串文字处理方式几乎完全相同 现在 我承认 C 和 C 在处理宽字符串文字方面存在差异 我发现的唯一区别在于通过字符串文字初始化数组 char str 3 abc OK in C but n