"hello world"字符串文字可以分配给字符 * 类型?
"hello world" string literal can be assigned to char * type?
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.
希望这会有所帮助。
- 字符类型转换不兼容
- 将超出范围的整数分配给有符号字符类型
- 当我输入字符类型的数字时,为什么我无法获得整数?
- 如何从文本文件中读取数值,直到遇到字符类型?
- 结构 init:字符**类型的标量初始值设定项两边的大括号
- 有没有办法将字符类型转换为整数?
- if(双精度类型 == 字符类型)
- 将 static_cast<int>(-15) 分配给静态常量字符类型变量
- 如何将字符类型变量附加到字符串中?
- 成本字符*类型的非常量引用的无效初始化,并且来自常量字符*类型的临时引用
- 基于字符类型的string_view模板
- C++ MDC final-在字符类型的数组结构中按字母顺序对记录中的名称进行排序
- 字符类型声明和验证
- 如何编写模板函数来添加整数但连接字符串和字符类型?
- 我的编辑距离递归代码中的字符类型有问题
- 为什么 QVariant 将字符类型视为整数类型
- 将文件内容复制到容器而不是字符类型
- C++ 如何从用户输入中读取第一个字符并忽略 rest(字符类型)
- 字符和常量字符[2] 类型的操作数无效到二进制运算符
- 对于不确定值的无符号字符类型,标准中特殊语言对于左值到右值的转换有什么意义?