雷达智富

首页 > 内容 > 程序笔记 > 正文

程序笔记

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

2024-06-24 41

问题描述

在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,只不过由于以前很多代码都有这种习惯,为了兼容,就保留下来了。

更新于:2个月前
赞一波!2

文章评论

全部评论