linux 环境下:warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

在C++中,直接将字符串字面量赋值给char指针会导致警告,因为这涉及到从const char*到char*的隐式转换,可能导致修改常量的行为。本文解析了这一现象的原因,并提供了两种避免警告的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在C++中,

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

会跳出警告:warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

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

robot@robot-NUC7CJYH:~/catkin_ws/src/SparkChain_Linux_SDK_2.0.0_rc1/SparkChain_Linux_SDK_2.0.0_rc1/ai/asr$ ./build.sh ./onlineAsr.cpp:29:19: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings] char* audioPath = "../../test_file/cn.pcm"; ^~~~~~~~~~~~~~~~~~~~~~~~ ./onlineAsr.cpp:32:20: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings] char * APPID = "e51e5e94"; //用户的APPID ^~~~~~~~~~ ./onlineAsr.cpp:33:20: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings] char * APIKEY = "942d3df08109ec0cba713560175d90a6"; //用户的APIKey ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./onlineAsr.cpp:34:20: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings] char * APISECRET = "NDZjYWM4MTRlYTQ1ZGVjNWIxMTZhNWUz"; //用户的APISecret ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./onlineAsr.cpp:35:20: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings] char * WORKDIR = "./"; //SDK工作目录,要求有读写权限 ^~~~ ./onlineAsr.cpp: In member function ‘virtual void ASRCallbacksImpl::onError(SparkChain::ASRError*, void*)’: ./onlineAsr.cpp:76:107: warning: format ‘%s’ expects argument of type ‘char*’, but argument 3 has type ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ [-Wformat=] 错,错误码: %d,错误信息:%s,交互sid:%s\n" RESET, errCode, errMsg, sid); ^ ./onlineAsr.cpp:76:107: warning: format ‘%s’ expects argument of type ‘char*’, but argument 4 has type ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ [-Wformat=] ./onlineAsr.cpp: In function ‘void run_asr(char*)’: ./onlineAsr.cpp:113:22: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings] audioPath = "../../test_file/cn.pcm"; ^~~~~~~~~~~~~~~~~~~~~~~~ ./onlineAsr.cpp:115:22: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings] audioPath = "../../test_file/en.pcm"; ^~~~~~~~~~~~~~~~~~~~~~~~ ./onlineAsr.cpp: In function ‘int main(int, const char**)’: ./onlineAsr.cpp:186:28: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings] run_asr("zh_cn"); ^ ./onlineAsr.cpp:189:28: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings] run_asr("en_us"); ^
最新发布
06-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值