You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++字符串字面量赋值char*为何只报警告而非教材所说的错误?

问题解答

核心结论

  • 教材表述完全准确,不存在错误
  • 仅出现警告是GCC默认兼容旧代码的设定,属于编译配置问题
  • 教材中提到的「error」指标准层面的非法代码定义,和编译器是否强制输出错误级别的诊断、终止编译没有冲突

正确的C++标准规则演进

  1. C语言 & C++98/03标准:字符串字面量的类型是char[N],但标准明确禁止修改其内容,将其赋值给非const char*属于弃用特性,编译器可保留兼容支持
  2. C++11及更高标准:字符串字面量的类型正式调整为const char[N],将其赋值给非const char*属于不符合标准的非法代码,编译器必须给出诊断信息

注意:C++标准仅要求编译器对非法代码输出诊断(警告/错误均可),并未强制要求必须终止编译,这是编译器可以默认只输出警告的合规依据

复现教材描述的报错行为的方法

GCC为了兼容海量遗留的旧C/C++代码,默认对该类兼容级别的问题仅输出警告,如需严格执行标准将其判定为错误,添加对应编译参数即可:

  • 仅针对字符串字面量转非const char*这类问题转为错误:-Werror=write-strings
  • 严格符合指定C++标准的所有要求,所有不符合标准的代码均报错:-pedantic-errors

另外你当前编译参数中的-std=c++0x是C++11正式发布前的实验性版本标识,建议替换为正式的-std=c++11或更高版本(如-std=c++17、-std=c++20)以获得完整的标准支持。

额外注意事项

即便编译器允许该赋值操作,后续尝试通过指针修改字符串字面量的行为也属于未定义行为,绝大多数运行环境下会触发段错误——因为字符串字面量默认存储在进程的只读内存段中,不允许修改。

内容的提问来源于stack exchange,提问作者user3755317

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:24:02