C代码存为.cpp文件在VS运行报错const char*无法赋值给char*
核心原因:C 和 C++ 对字符串字面量的类型定义存在差异,二者并非100%语法兼容
你遇到的报错是两种语言标准的设计差异导致的,具体规则如下:
- C 标准中,字符串字面量(比如
"engine a")的类型是char[],虽然它实际存储在只读内存段、修改其内容会触发未定义行为,但类型本身没有const修饰,所以赋值给char*类型的变量是语法合法的,编译器一般只会给出可选警告,不会报错,你看的教程大概率是用C编译器跑的代码,所以可以正常运行。 - C++ 标准中,字符串字面量的类型是
const char[],天生携带const属性,C++的类型检查远严格于C,因此将const char*类型的值赋值给无const修饰的char*属于明确的类型不匹配,会直接触发编译错误。
解决方案
你可以根据需求选择任意一种方式解决:
- 保留C语言的编写逻辑,将文件后缀从
.cpp改为.c,Visual Studio会自动调用C编译器编译代码,不会触发该报错。 - 适配C++的类型规则,修改结构体成员的类型声明,加上
const修饰:
struct { const char* engine; } car1, car2; int main(void) { car1.engine = "engine a"; car2.engine = "engine 2"; return 0; }
- (不推荐)在Visual Studio的C++编译设置中关闭
/permissive-开关,启用非标准兼容模式,编译器会放宽类型检查允许该赋值操作,但会丢失const安全校验,后续很容易触发未定义的内存操作问题。
内容的提问来源于stack exchange,提问作者kimk463
相关产品推荐
相关产品推荐

