3789|9

51

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于C++和c的字符串问题 [复制链接]

我创建一个.c文件,写了一个函数LCD_DispString(unsigned char *str),在后面调用这个函数的时候如LCD_DispString("ABC");在keil下会显示一个警告,不过不影响大局,当我把.c后缀改成.cpp时,keil下会在LCD_DispString("ABC");出显示错误error:  argument of type "const char *" is incompatible with parameter of type "unsigned char *",必须写成LCD_DispString((unsigned char *)"ABC");才能编译通过,如何才能在C++下避免这种问题。

此帖出自stm32/stm8论坛

最新回复

听说mbed是基于C++的,不知道现在用的人多不,表示c++学的不多!  详情 回复 发表于 2015-1-19 14:24
点赞 关注
 

回复
举报

1531

帖子

49

TA的资源

五彩晶圆(中级)

沙发
 
学习下,之前没遇到过这种问题
此帖出自stm32/stm8论坛
 
 

回复

1560

帖子

24

TA的资源

五彩晶圆(初级)

板凳
 
本来就应该那样啊。简单点的,你先声明一个数组吧,然后把数组名放进去就可以了。
此帖出自stm32/stm8论坛
 
个人签名这孩子,成熟的象征,理智的典范。
 

回复

6040

帖子

203

TA的资源

版主

4
 
避免这种问题当然是要提高你的代码质量,编译器提出的都是非常有意义的提示。
你把常量指针赋给变量指针,就有可能导致操作失误,所以编译器提示你必须要加强制转换。
此帖出自stm32/stm8论坛
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(中级)

5
 
之前看到st的官方例程都是把字符串存在数组里,感觉十分麻烦就没怎么注意,而且看到好多人的程序里都没这么用,所以就一直忽视这个问题,但是如果有大量的字符串存在数组里,不是占用了大量的rom。
此帖出自stm32/stm8论坛

点评

1. const unsigned char* 和unsigned char*是不一样的,const unsigned char*所指向对象的内容是不可更改的,而unsigned char*所指向对象的内容是可更改的。你的函数是unsigned char*类型的,说明在你的函数中,有可  详情 回复 发表于 2014-10-26 11:14
 
 
 

回复

449

帖子

0

TA的资源

纯净的硅(中级)

6
 
晓枫VS枯叶 发表于 2014-10-26 10:56
之前看到st的官方例程都是把字符串存在数组里,感觉十分麻烦就没怎么注意,而且看到好多人的程序里都没这么 ...

1. const unsigned char* 和unsigned char*是不一样的,const unsigned char*所指向对象的内容是不可更改的,而unsigned char*所指向对象的内容是可更改的。你的函数是unsigned char*类型的,说明在你的函数中,有可能会修改被传入对象的内容,而被传入对象是“ABC”之类的固定字符串,这类确定的字符串是存在FLASH中、不可更改的,所以会给出错误;

2. 如果什么地方都用(unsigned char*)强制转换,会很麻烦,一种较方便的做法,是将函数DispString(unsigned char *str)修改为DispString(const unsigned char *str);


3. 当然,既然是C++,那么还有另一种方法,就是函数重载。除了DispString(unsigned char *str)函数外,再编写一个DispString(const unsigned char *str)就可以了。
此帖出自stm32/stm8论坛
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(中级)

7
 
之前没有考虑的这个问题,C++函数的重载还是很好的方法,不过定义函数DispString(const unsigned char *str)后面调用还是会出错,必须定义DispString(const  char *str),后面调用才不会出错,不过这样改变了*str的数据类型,后面不知道使用的时候会不会出问题!之前学C++只学了简单的MFC,没有深入的学习,看来现在要巩固下C++,谢谢 lonerzf 和 Aragorn !
此帖出自stm32/stm8论坛

点评

倒是忘记编译器把固定字符串编译成const char*类型而不是const unsigned char*类型,总之定义成跟编译器一样就行了。至于出问题倒不会,unsigned char和char内容是一样的,指针长度也是一样的。我就一直用C++做项目  详情 回复 发表于 2014-10-26 12:33
 
 
 

回复

449

帖子

0

TA的资源

纯净的硅(中级)

8
 
晓枫VS枯叶 发表于 2014-10-26 11:42
之前没有考虑的这个问题,C++函数的重载还是很好的方法,不过定义函数DispString(const unsigned char *st ...

倒是忘记编译器把固定字符串编译成const char*类型而不是const unsigned char*类型,总之定义成跟编译器一样就行了。至于出问题倒不会,unsigned char和char内容是一样的,指针长度也是一样的。我就一直用C++做项目,直接做printf打印函数就如此重载,从未出问题。
此帖出自stm32/stm8论坛
 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(初级)

9
 
听说mbed是基于C++的,不知道现在用的人多不,表示c++学的不多!
此帖出自stm32/stm8论坛
 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(中级)

10
 
感觉mbed用的人不多,但是应该能简化设计,看过Arduino的一些代码,发现和mbed的共同点就是不用了解底层硬件就能设计,只需调用库函数就够了,但是貌似器件商对这个平台的软件支持不怎么大,硬件支持还是不错的!
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表