【问题标题】:What is the datatype of string literal in C++?C ++中字符串文字的数据类型是什么?
【发布时间】:2012-09-13 03:15:21
【问题描述】:

我对字符串文字的数据类型感到困惑。是const char * 还是const char

【问题讨论】:

  • 查看我对类似问题的回答stackoverflow.com/questions/12451496/…
  • 从有这个错误的人数来看(认为它的 const char*),我不明白为什么这被否决了。当一半的受访者不知道答案时,显然这是一个非常好的问题。
  • @Ken C 和 C++ 在这方面的唯一区别是 const 限定符。 C 将其视为char[N] 而不是const char[N]
  • @Ken,这里证明了它们是 C 中的数组,使用了 Seth 对 C++ 所做的相同方法:liveworkspace.org/code/198d050af0d08a9fc86ac17c144d581d。如果它是一个指针,大小很可能不是 11。如果你想消除奇怪的指针大小,你可以在第一个旁边放一个不同长度的。

标签: c++ string literals


【解决方案1】:

"Hello world"const char[12](十一个字符加上 '\0' 终止符)。

L"Hello world"const wchar_t[12]

从 C++14 开始,"Hello world"s 就是 std::string

还要注意 C++11 添加的 u8""u""U"" 字符串文字符号,它们分别指定 UTF-8、UTF-16 和 UTF-32 编码。非限定字符串文字(即""L"")的编码是(并且一直是)实现定义的。

【讨论】:

  • 只是一个菜鸟问题:将s 添加到字符串文字是否使其成为std::string 类型?如果不是,为什么要使用它?
  • @AjaySinghNegi 实际上""s 是一种拥有std::string literal 的方式。从 C++11 开始,您可以拥有 user-defined literals
  • 在 cpp 中,如果写入 string s = "abc;,字符串文字不会隐式转换为字符串。如果是,那么为什么使用""s
  • @AjaySinghNegi 有几个原因。一是没有发生转换。 std::string 类型的文字 is。这可以有所作为,例如在模板上下文中。
【解决方案2】:

这是一个const char[N](与char const[N]相同),其中N 是字符串的长度加上终止NUL 的长度(或者只是如果您将“字符串长度”定义为已包含NUL,则字符串的长度。

这就是为什么您可以使用sizeof("hello") - 1 来获取字符串中的字符数(包括任何嵌入的NULs);如果它是一个指针,它就不起作用,因为它总是你系统上指针的大小(减一)。

【讨论】:

  • 要备份它,窄字符串文字的类型为“n const char 数组”,其中 n 是字符串的大小,如下定义,并且具有静态存储持续时间 (3.7) .
  • 不会反对。但是,当在模板匹配中使用字符串常量时,它似乎是char [N](而不是char const[N]),至少在一种用法中......上下文是:我有模板。内存。 func func(T const &x) 实例化为 A.func("string") 并与 T 匹配为 char [7]。奇怪的。或者可能是因为参数 x 是 'const ref to an array [7] of const char',第二个 const 被删除为多余的,第一个不是 T.g++ 4.6.3
  • @greggo:C 字符串文字是char[]。 C++ 直到并包括 C++03 allows(但不推荐)将字符串文字分配给非常量 char*,尽管 C++ 字符串文字 always @ 987654335@。从 C++11 开始,将字符串文字分配给非常量 char *不允许 没有显式转换的。
  • @DevSolar 谢谢,你让我记住了,只有一个问题,在 C 中字符串文字可以转换为 char * 吗?
  • @SurajJain:Any 数组可“转换”为指向其第一个元素的指针。但是您无法通过sizeof 确定数组的大小。
猜你喜欢
  • 2013-03-08
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-21
  • 2013-08-27
  • 1970-01-01
相关资源
最近更新 更多