warning:deprecated conversion from string constant to 'char *'解决方案

指针定义字符串的一些问题 [Warning] deprecated conversion from string constant to char* —新人文 在学习指针定义字符串时,我遇到了 [Warning] deprecated conversion from string constant to ‘char*’ [-Wwrite-strings] 的困扰,为什么会有这个警告? 为了解决这个问题,我去查阅了很多资料,故在此写下我的第一篇博客,希望能够帮助到大家。 如有错误,希望大家指出。 在这之前,我觉得有必要先说一下指针和数组定义的字符串之间的一些区别 我们先看这样一段代码,大家也可以尝试着运行感受一下 #include<stdio.h> i 阅读详情

经常看到这个警告,平常都没重视它。但有警告总是让人不爽,搜了一下,xyy410874116 同学有研究。学习后转载记录于此!

原文地址:http://blog.youkuaiyun.com/xyy410874116/article/details/6397549


Linux 环境下当GCC版本比较高时,编译代码可能出现的问题

问题是这样产生的,先看这个函数原型:

void someFunc(char *someStr);

再看这个函数调用:

someFunc("I'm a string!");

把这两个东西组合起来,用最新的g++编译一下就会得到标题中的警告。

为什么呢?原来char *背后的含义是:给我个字符串,我要修改它。

而理论上,我们传给函数的字面常量是没法被修改的。

所以说,比较和理的办法是把参数类型修改为const char *。

这个类型说背后的含义是:给我个字符串,我只要读取它。

很自然的延伸一下。

如果我既要传字面常量又要传字符串变量怎么办呢?......重载

实验:

对deprecated conversion from string constant to 'char *'此类警告的详细解释

假定你想使用一个char*类型的变量,有时指向一个字符串,有时指向另外一个字符串。开始的代码就像这样:
char *msg;
msg = "hello";
msg = "good-bye";

编译器会对这段代码给出两段警示,说”deprecated conversion from string constant to 'char *'",意思就是说你没有能力修改字符串的内容。如果将代码写成这样,如:
char *msg = "hello";
*msg = 'j';
printf( "%s/n", "hello" );

编译器会通过编译,实际上会将msg指向的内容从"hello"转变为"jello", 正确的解决方法是将msg声明为一个指向不变字符串的指针:
const char  *msg;
msg = "hello";
msg = "good-bye";

这段代码可以成功编译,并且将msg指向的值如愿改变,但如果你将指针指向的指进行赋值:
*msg = 'j';
将会产生一个错误,不能修改一个字符串常量

注意如下的代码,此代码编译时不会出现警告也不会出现任何错误:
const char  *msg;
char   buf[ 10 ];   //注意不能使用char *buf;
sprintf( buf, "%03d/n", 7 );
msg = buf;

改变buf的内容是可以的,因为它并没有被声明为常量。在这种情况下,msg将指向一个字符串,"007/n". 像这种语句
*buf = 'x';
将会正确编译执行,但像
*msg = 'x';
将会产生一个警告,因为msg指向的内容不允许改变


还有一种方法是使用强制转换,使用强制转换意味着你清楚会出现什么情况,不需要编译器为你做出判断,例如下面的代码将不会产生警告:
char  *msg;
msg = (char *) "hello";


但一旦你使用强制转换,编译器对如下语句进行编译时,也不会出现错误或警告
*msg = 'j';

这个错误将一直存在,但并不会被发现,直到运行时。那时再找出错点就相当麻烦了,比编译器提醒你,麻烦多了。所以,最好不要对字符串使用强制转换。

Constant 指针

根据constant的位置不同,可以有以下四种情况:
const char* const msg_0;
const char       *msg_1;
char* const msg_2;
char       *msg_3;


其中,msg_0是一个constant指针指向一个const字符串。这个声明编译器会给出一个警告,因为msg_0的指向没有被初始化,而且之后的语句也无法对mg_0进行赋值,如
const char const *msg_0 = "hello";
会编译成功,但
*msg_0 = 'j';或者
msg_0 = "good-bye"; 将会产生错误

msg_1既可以指向一个const字符串,也可以指向一个可变的字符串,但是不能修改它所指向的字符串的内容。

编译msg_2这条语句,会出现和编译msg_0一样的错误。因为指针是一个常量,所以它应该首先被赋值。如果刚开始已经赋值,那么它可以对指向的字符串内容进行修改,如:
char        buf[ 10 ];
char * const msg_2 = buf;
这段代码里,msg_2指向buf[0],并且永远指向这个地址,不会改变;

对于msg_3,就没太多可以说的。你可以改变指针,也可以改变指针指向的内容。

Dev C++中string和char的一些问题及deprecated conversion from string constant to ‘char*’ 最近在dev c++上写字符串程序。遇到一些问题,string和char都是字符类型的。但是在dev里面使用还有点差异。 关于string 首先,我先写了这个代码 #include<stdio.h> #include<string.h> int main(void) { string s = "hello"; printf("%s",s); return 0; } ... 阅读详情

相关推荐

Arduino IDE 2.3.2 配置 UNO R4 WIFI 开发环境避坑指南(附LED矩阵驱动测试)

本文详细介绍了如何在Arduino IDE 2.3.2中配置UNO R4 WIFI开发环境,并提供了LED矩阵驱动的实战指南。从开发环境搭建到硬件连接,再到LED矩阵的初始化和弹球动画实现,手把手教你避开常见配置陷阱,最终实现流畅的动画效果。特别适合刚接触UNO R4 WIFI的开发者快速上手。

weixin_28675839的博客 220

warning: deprecated conversion from string constant to ‘char*’

环境:linux下使用g++编译报错:warning: deprecated conversion from string constant to ‘char*’意思:不接受字符串(string)转换为字符串常量(char*)报错代码:#include &lt;iostream&gt; using namespace std; void print(char *s) { cout&lt;&...

djw931017的博客 2368

H.264 Profile与Level详解:如何为不同应用场景选择合适的编码配置

本文深入解析了H.264编码标准中的Profile与Level概念,指导开发者如何为不同应用场景选择合适的配置。文章对比了Baseline、Main和High三大Profile的特性与适用场景,并解释了Level如何限定视频的分辨率、帧率与码率上限。通过实战指南,帮助读者在视频通话、在线点播和专业制作等场景中,平衡画质、兼容性与性能,实现高效编码。

rgv2345678的博客 238

deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]

deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]char *背后的含义是:给我个字符串,我要修改它。而理论上,我们传给函数的字面常量是没法被修改的。所以说,比较和理的办法是把参数类型修改为const char *。这个类型说背后的含义是:给我个字符串,我只要读取它。...

瞌睡的洋葱的博客 1163

保姆级教程:用CANoe的LIN Slave Conformance Tester搞定一致性测试(附LDF配置避坑点)

本文详细介绍了如何使用CANoe的LIN Slave Conformance Tester进行汽车电子LIN从节点一致性测试,包括测试环境搭建、LDF文件配置、多通道测试技巧及常见问题解决方案。通过实战案例和高级配置技巧,帮助工程师高效完成测试任务,确保LIN总线通信的可靠性。

weixin_30385925的博客 525

【SOC估算】基于EKF与神经网络融合的锂电池SOC高精度估计及Matlab实现

本文探讨了基于EKF与神经网络融合的锂电池SOC高精度估计方法。通过结合扩展卡尔曼滤波(EKF)的模型驱动优势和神经网络的数据驱动学习能力,实现了对电池荷电状态(SOC)的精准预测。Matlab仿真验证了该混合算法在各种工况下均能显著降低估计误差,提升电池管理系统性能。

play7的博客 695

warning:deprecated conversion from string constant to 'char *'[-Wwrite-strings]解决方案

Linux 环境下当GCC版本比较高时,编译代码可能出现的问题 问题是这样产生的,先看这个函数原型: void someFunc(char *someStr); 再看这个函数调用: someFunc("I'm a string!"); 把这两个东西组合起来,用最新的g++编译一下就会得到标题中的警告。 为什么呢?原来char *背后的含义是:给我个字符串,我要修改它。 而理论上,我们...

dingzj2000的专栏 2万+

基于YOLOv5/v8/v10的垃圾分类识别系统:设计实现与性能优化(附代码+数据集)

做完这个毕设,你已经掌握了从数据准备、模型训练到界面开发的全流程。把模型部署到树莓派上,做个真正的“智能垃圾桶”硬件装置;加入语音提示功能,检测到垃圾后自动语音播报类别;试试融合多个YOLO模型的优势,让分类精度再上一个台阶。按照这个教程一步步做,你的毕设不仅能顺利完成,还能做出很多亮点。要是过程中遇到啥问题,别慌,慢慢琢磨或者咱们一起聊聊,肯定能把这个毕设做成让你满意的作品。

know_F0727的博客 462

warning:deprecated conversion from string constant to 'char *' 解决方案2

#include using namespace std; int fuc(char *a) { cout << a << endl; } int main() { fuc("hello"); }

u013048416的专栏 771

conda install出现CondaValueError: Malformed version string invalid character(s)解决方案

本文主要介绍了conda install出现Solving environment:failed、CondaValueError: Malformed version string invalid character(s),希望能对新手有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 步骤一 2.2 步骤二 2.3 步骤三

weixin_43178406的博客 6万+

170、电机控制中的温升测试

本文以一次IGBT炸管事故为切入点,深入剖析电机控制中温升测试的实质:不仅是温度测量,更是对铜损、铁损、散热效率等热管理问题的系统验证。作者强调测试前热电偶布置、环境记录、预运行的重要性,提出实时监控电流谐波、绕组电阻、散热梯度等关键参数,并通过损耗分离与冷却系统实测,揭示真实热源。结合温升曲线异常分析与经验建议,强调留余量、仿真结合实测、关注瞬态工况等实践要点,警示温升测试是保障可靠性与安全性的核心环节。

2401_88858637的博客 47

warning:deprecated conversion from string constant to 'char *' 解决方案

#include using namespace std; int fuc(char *a) { cout << a << endl; } int main() { fuc("hello"); } Linux 环境下当GCC版本比较高时,编译代码可能出现的问题 问题是这样产生的,先看这个函数原型: 1 v

sinat_31869361的博客 371

时间序列预测 — 预测数据集(负荷、风电、光伏、销量等)

GEFCom2014 “负荷预测数据”为竞赛的公共数据集,GEFCom2014 的负荷预测轨迹为概率负荷预测。

几度春风里的博客 2万+

android NDK开发遇到warning:deprecated conversion from string constant to 'char *'解决方案

Linux 环境下当GCC版本比较高时,编译代码可能出现的问题 问题是这样产生的,先看这个函数原型: void someFunc(char *someStr); 再看这个函数调用: someFunc("I'm a string!"); 把这两个东西组合起来,用最新的g++编译一下就会得到标题中的警告。 为什么呢?原来char *背后的含义是:给我个字符串,我要修改它。 而理论上,我们

JJMM2009的专栏 922

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: 《敏捷软件开发》读书笔记(四)
下一篇: C++中类型引导关键字class 和 typename
e5Max
博客等级 码龄14年 145粉丝 129原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值