C++中字符串文字的数据类型是什么

What is the data type of a string literal in C++?

本文关键字:数据类型 是什么 文字 字符串 C++      更新时间:2023-10-16

关于C++中字符串文字的数据类型,也提出了类似的问题。

许多人引用了标准:

窄字符串文字的类型为"array of n const char",其中n是如下定义的字符串大小,并且具有静态存储持续时间(3.7)

我在主函数中写了以下语句:

  char cstring[]= "hellohellohellohellohellohello";

但是我在程序集中找不到任何作为静态数据存储的字符串文字。事实上,程序集显示字符串被分解并直接"存储"在指令中。

    movl    $1819043176, -48(%rbp)
    movl    $1818585199, -44(%rbp)
    movl    $1701343084, -40(%rbp)
    movl    $1752132716, -36(%rbp)
    movl    $1869376613, -32(%rbp)
    movl    $1819043176, -28(%rbp)
    movl    $1818585199, -24(%rbp)
    movw    $28524, -20(%rbp)
    movb    $0, -18(%rbp)

全局范围中的类似语句的结果是字符串存储为静态数据。

char cstring1[] = "hellohellohellohellohellohello";

组装

cstring1:
    .string "hellohellohellohellohellohello"

以上示例可在此处在线获取。

因此,这似乎不符合引用的标准。也许这里引用的内容有一些例外?

它确实符合标准,符合"好像"规则。

由于字符串文字的唯一用途是初始化cstring,因此不需要任何对象表示。编译器已经消除了它,而通过另一种方法初始化cstring,这种方法具有等效的结果,但编译器认为在某些方面(速度或代码大小)更好。

表达式具有类型。如果字符串文字用作表达式,则它们具有类型你的不是

考虑以下代码:

#include <stdio.h>
#define STR "HelloHelloHello"
char global[] = STR;
int main(void)
{
    char local[] = STR;
    puts(STR);
}

这个程序中有三个字符串文字是使用相同的标记形成的,但它们的处理方式不同。

第一个是global的初始化器,它是具有静态生存期的对象的静态初始化的一部分。根据第3.6.2节,静态初始化不必在运行时进行;编译器可以安排在二进制图像中对结果进行预格式化,这样进程就可以在数据已经到位的情况下开始执行,并且在这里已经这样做了。以与local[]相同的方式初始化此对象也是合法的,只要它是在全局动态初始化开始之前执行的。

第二个是local的初始值设定项,它是一个字符串文字,但实际上并不是一个表达式。它是根据8.5.2的特殊规则处理的,该规则规定字符串文字中的字符独立用于初始化数组元素;字符串文字不作为一个单位使用。此对象具有动态初始化,从而在运行时加载值。

第三个是puts()调用的参数,它实际上使用字符串文字作为表达式,并且它的类型为const char[N],对于该调用,它将衰减为const char*。如果你真的想研究用于处理字符串文字的运行时类型的对象代码,你应该在表达式中使用文字,就像这个函数调用一样。

我认为您引用的定义必须被解释为引用未明确声明存储位置的字符串文字,例如printf()中的格式表达式。为了让这样的代码工作,这些字符串文字必须存储在的某个地方;如果无法从上下文推断,则定义指定它们的存储位置。

附带说明:main()中的字符串文字不会显示为静态数据,因为函数中声明的变量默认情况下是"自动"的。如果您改为编写static char cstring[]=...,那么就会在与cstring1[]相同的位置看到它。

还有一件事:存储位置不是数据类型的一部分!