无法从"const char [3]"转换为"char *"x100000(Qt Creator C++ Windows 32)

cannot convert from 'const char [3]' to 'char *' x100000 (Qt Creator C++ Windows 32)

本文关键字:char Qt x100000 Creator C++ Windows 转换 const      更新时间:2023-10-16

就在五分钟前,当我点击f5并得到102个错误时,一切都很好:

error: C2440: 'initializing' : cannot convert from 'const char [17]' to 'char *'
Conversion from string literal loses const qualifier (see /Zc:strictStrings)

具体的是在第30行:

char* hexchars = "0123456789ABCDEF";

我至少有一个星期没有碰错误所在的文件了。我通常会说我不小心更改了编译参数中的某些内容,但在它开始出错之前,我一直没有打开设置。

有什么想法吗?我一定是心不在焉地更改了一些设置,但我真的不记得当时在想"哦,我刚才做了什么?"

当您使用类似的代码时

char *astring2 = "some letters";

C++(和C)将其放入只读存储器中。即使不是常量,也不能修改用文字初始化的char指针的内容。

此外,您不能更改指针的地址,因为由于上述规则,它会导致内存泄漏。

然而,这并不遵循该规则,除非你将其设为常量:

char astring[] = "some letters that can be changed";
char *ptrToString = astring; //work
astring2 = astring //not work

自从C++首次标准化以来,字符串文字的类型为char const[N]。在这一点上,C不支持const,许多代码为char*分配了字符串文字。因此,C++中出现了一条特殊规则,允许从字符串文字初始化char*。此规则立即遭到否决。

C99也引入了const关键字。当C++11被标准化时,不推荐使用的规则被取消了,从字符串文字初始化char*并不违法,因为它本来应该是正确的。预期的是,C++编译器会对多年来不推荐使用的赋值发出警告(所有供应商都表示他们这样做了),即用户有多年的准备时间来修复他们的代码。

显而易见的修复方法是从字符串文字初始化char const*而不是char*

如果你真的需要一个指向可变char数组的指针,你可以创建它并使用进行初始化

char array[] = "string literal";