"hello world"字符串文字可以分配给字符 * 类型?

"hello world" string literal can be assigned to char * type?

本文关键字:字符 类型 分配 hello world 字符串 文字      更新时间:2023-10-16
char* foo = "fpp"; //compile in vs 2010 with no problem

i虽然字符串文字是const char* type。
const类型不能分配给非const类型。
因此,我希望上面的代码失败或我缺少某些内容?

编辑:对不起,我完全忘记了编译器也发出警告。
我一直在寻找错误列表。
我忘了检查。

edit2:我将项目警告级别设置为enableallwarnings(/wall),对此没有警告。
所以我的问题仍然有效。

c 03弃用 [ref 1] 使用字符串文字不带const关键字。

[REF 1] C 03标准:§4.2/2

不是宽字符串字面的字符串文字(2.13.4)可以转换为"指向char指针"类型的rvalue;宽字的字面文字可以转换为"指向WCHAR_T指针"类型的rvalue。无论哪种情况,结果都是指向数组的第一个元素的指针。仅在有明确的指针目标类型时才考虑这种转换,而不是当一般需要从lvalue转换为rvalue时。[注意:此转换被弃用。请参见附件D]为了在过载分辨率(13.3.3.1.1)中排名,此转换被认为是数组转换为分量转换,然后是资格转换(4.4)。[示例:" ABC"被转换为"指针"作为数组转换为指数转换,然后转换为"指针到char"作为资格转换。]

c 11简单地删除了上述引号,这意味着它是C 11中的非法代码。

在C 03之前,C 在没有const关键字的情况下派生了字符串的声明,请注意,在C。

中,相同的有效

正如我所理解的,在C中,在添加const之前,这是将字符串分配给指针的方法。

在C 中,这是不建议的行为,但仍被允许保持向后兼容性。所以不要使用它。

实际上,我相信C 11这是完全无效的。

不完全。字符串文字可分配给char*类型。不应修改字符串文字。

这种奇怪的情况是在const存在之前与程序向后兼容。

gcc -std=c++0x警告:

a.cpp:5:14:警告:不弃用从字符串常数到'char*'[-wwrite-strings]

所以,这仍然允许,但不弃用,因为字面字符串是const。

没有const类型的东西。const关键字是所谓的类型限定符。它可以应用于任何指针类型,仅表示不应修改指向指向的值。

您也可以以这种方式将const限定符应用于指针参考本身:

char* const p ="aaa";

这将保护指针变量对另一个字符串。

有一个特殊的隐式转换可以支持这一点,因为它是旧版代码中的常见成语(通常在const存在之前写)。字符串的字体类型是char const[],您只能使用它。一个好的编译器将在上述警告中,因为从引入的那一刻起就弃用了转换。

请注意,这与c不同,其中字符串的类型是 char[](但试图修改它仍然是未定义的行为)。

您正在谈论C字符串,这实际上是char的向量。在C 中,使用类std::string,以及将常数字符串作为const std::string

创建

无论如何,编译器在将来的程序中保留一段记忆,以存储出现在源代码中的文字字符串。内存的这一部分被视为只读,因此您用const char *指向它。它的大小恰好是字符串的大小加上尾部零的一个额外位置,标记了字符串的末端。

编译器需要保持向后兼容性,因此他们仍然接受char *指向的文字。但是,这是误导的,因为您不应该修改可以存储在嵌入式系统中的ROM中的内存。

在我的系统中,我使用clang:

$ clang --version
Ubuntu clang version 3.0-6ubuntu3 (tags/RELEASE_30/final) (based on LLVM 3.0)
Target: i386-pc-linux-gnu
Thread model: posix

在Clang C编译器中,此代码在没有错误的情况下编译:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char * str = "Hello, World!";
    printf( "%s", str );
    return EXIT_SUCCESS;
}

但是,当编译为C 程序时,相同的代码(带有较小的修改,例如标题的名称)会发出以下警告:

kk.cpp:6:15: warning: conversion from string literal to 'char *' is deprecated [-Wdeprecated-writable-strings]
        char * str = "Hello, World!";
                     ^
1 warning generated.

希望这会有所帮助。