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

Lup*_*upe 4 c++ windows qt 32-bit

五分钟前,当我轻按f5并出现102个错误时,一切运行正常:

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

该特定行位于第30行:

char* hexchars = "0123456789ABCDEF";
Run Code Online (Sandbox Code Playgroud)

至少一个星期以来,我都没有触摸过错误所在的文件。我通常会说我不小心更改了编译args中的某些内容,但是自从在错误开始之前就没有打开设置。

有任何想法吗?我一定是心不在changed地更改了某些设置,但我真的不记得想过“嗯,我刚刚做了什么?”

Jak*_*mos 6

当您使用这样的代码时

char *astring2 = "some letters";
Run Code Online (Sandbox Code Playgroud)

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

同样,您不能更改指针的地址,因为由于上述规则,这将导致内存泄漏。

但是,除非您将其设为const,否则这并不遵循该规则:

char astring[] = "some letters that can be changed";
char *ptrToString = astring; //work
astring2 = astring //not work
Run Code Online (Sandbox Code Playgroud)


Die*_*ühl 5

char const[N]自 C++ 首次标准化以来,字符串文字就具有类型。此时 C 还不支持const,并且许多代码将字符串文字分配给char*. 因此,C++ 中出现了一条特殊规则,允许char*从字符串文字进行初始化。这条规则立即被废弃。

C99const也引入了一个关键字。char*当 C++11 标准化时,已弃用的规则被取消,并且从字符串文字初始化 a 并不违法,因为它应该是正确的。人们期望 C++ 编译器多年来就已弃用的分配发出警告(所有供应商都表示他们这样做了),即用户有多年的准备时间来修复他们的代码。

明显的解决方法是从字符串文字初始化 achar const*而不是 a 。char*

如果您确实需要一个指向chars 的可变数组的指针,您可以创建它并使用以下命令对其进行初始化

char array[] = "string literal";
Run Code Online (Sandbox Code Playgroud)