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

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

就在五分钟前,当我点击 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";

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

有什么想法吗?我一定是心不在焉地更改了一些设置,但我真的不记得当时在想 "uh oh what did I just do?"

当你使用这样的代码时

char *astring2 = "some letters";

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

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

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

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";