编译报错: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
相关文章
- MySQL5.7 中使用 group by 报错 this is incompatible with sql_mode=only_full_group_by
- linux中Qt工程编译报错: error: 找不到 -lGL
- PHP7.4命令行报错:VC运行库和PHP版本不兼容
- 打开vmware虚拟机报错—该虚拟机似乎正在使用中
- 前端请求PHP接口,报错跨域问题
- Apache报错:无法使用可靠的服务器域名
- mysql报错xamp table 'pma__recent' is read only
- 浏览器报错 ERR_SSL_VERSION_OR_CIPHER_MISMATCH
- linux编译报错:/usr/include/c++/7/cstdlib:41:10: fatal error: bits/c++config.h: No such file or directory
- Linux下编译libxml源码时,报错:/usr/include/x86_64-linux-gnu/bits/fcntl2.h:50:4: error: call to '__open...
- Linux下编译libxml2的源码报错:you must specify a host type if you use `--no-verify'
- vscode中通过ssh远程连接linux报错:Bad owner or permissions on C:\\Users\\用户名/.ssh/config
- Open SUSE Linux中编译内核模块报错
- EF报错Win32Exception: 证书链是由不受信任的颁发机构颁发的。
- EF Core 8 (EF8) Contains报错:Microsoft.Data.SqlClient.SqlException (0x80131904): 关键字 'WITH' 附近有语法错误。
- C/C++使用gcc或g++编译报错:error: parameter ‘xxx’ set but not used [-Werror=unused-but-set-parameter]
- Ubuntu Linux中apt/dpkg安装报错:Sub-process /usr/bin/dpkg returned an error code (1)
- Git报错 fatal : fetch-pack: invalid index-pack output
- Qt编译报错:error: LNK1181: cannot open input file 'debugmain.obj'
- C++编译报错:fatal error: speex/speex_resampler.h: No such file or directory
文章评论
全部评论