侧边栏壁纸
  • 累计撰写 185 篇文章
  • 累计创建 77 个标签
  • 累计收到 18 条评论

目 录CONTENT

文章目录

编译报错:warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]

码峰
2023-03-19 / 0 评论 / 0 点赞 / 721 阅读 / 364 字 / 正在检测是否收录...
广告 广告

问题描述

在C中编译时,如下代码会报警告:warning: ISO C forbids converting a string constant to ‘char*’ [-Wwrite-strings]

char* p = "abc";  // valid in C, invalid in C++

解决办法

改成下面会通过warning

char* p = (char*)"abc";  // OK

或者改成下面

char const *p = "abc";  // OK

原因分析

学习c或者c++的时候都知道,如果在赋值操作的时候,等号两边的变量类型不一样,那么编译器会进行一种叫做 implicit conversion 的操作来使得变量可以被赋值。
在上面的表达式中等号右边的"abc"是一个不变常量,在c++中叫做string literal,type是const char *,而p则是一个char指针。如果强行赋值会发生什么呢?没错,就是将右边的常量强制类型转换成一个指针,结果就是我们在修改一个const常量。编译运行的结果会因编译器和操作系统共同决定,有的编译器会通过,有的会抛异常,就算过了也可能因为操作系统的敏感性而被杀掉。
像这种直接将string literal 赋值给指针的操作被开发者们认为是deprecated,只不过由于以前很多代码都有这种习惯,为了兼容,就保留下来了。

0
广告 广告

评论区