关于ADS编译

[复制链接]
3857|11
 楼主| 箫笑 发表于 2009-1-17 21:24 | 显示全部楼层 |阅读模式
发现ADS与Keil对C的编译有点不同,按照以前的习惯是把函数声明放在XX.h里,定义放在XX.c里,<br /><br />刚刚用C写了个arm的串口打印字符串的程序,原型是<br />void&nbsp;RS232WriteStr(unsigned&nbsp;char&nbsp;*Pstr);<br /><br />开始时忘记声明函数了,在另外一个文件里这样调用这个函数<br />RS232WriteStr(&quot;OK&quot;);<br />编译时竟然只是警告,运行没有问题,后来发现问题,把声明写进来,竟然是错误,无法通过编译。<br />implicit&nbsp;cast&nbsp;of&nbsp;pointer&nbsp;to&nbsp;non-equal&nbsp;pointer<br /><br />请问这是什么道理呢?
阿南 发表于 2009-1-17 21:40 | 显示全部楼层

加extern没有.是不是定义的那个文件又包含了声明的头文件

  
 楼主| 箫笑 发表于 2009-1-17 21:45 | 显示全部楼层

re

嗯,是把声明的头文件包含进定义的C文件,<br />先声明,然后定义,这样子会有问题吗?
 楼主| 箫笑 发表于 2009-1-17 21:48 | 显示全部楼层

re

我也试过不在头文件里加声明,直接在要调用函数的那个文件里加入<br />extern声明,编译结果都是一样的。
zyok 发表于 2009-1-17 22:05 | 显示全部楼层

一个是字符指针,一个是字符串???

行吗?
 楼主| 箫笑 发表于 2009-1-17 22:09 | 显示全部楼层

字符串传过去的不就是首字符的地址

之前在keil里是这样写的,而且ADS里不声明也是可以打印字符的,问题就是声明了反而出问题了。
阿南 发表于 2009-1-17 22:21 | 显示全部楼层

在定义的文件里,不要加extern声明

  
computer00 发表于 2009-1-17 22:38 | 显示全部楼层

错误原因明明是指针类型不符呀...

传递进去的是常量char型,所以你的定义和声明要加上const...<br /><br />要用const&nbsp;char&nbsp;*,而不是unsigned&nbsp;char&nbsp;*………………
洪七公 发表于 2009-1-17 22:43 | 显示全部楼层

void RS232WriteStr(const char *Pstr);

或<br />RS232WriteStr((const&nbsp;char&nbsp;*)&quot;OK&quot;);<br /><br /><br />
 楼主| 箫笑 发表于 2009-1-18 10:40 | 显示全部楼层

多谢楼上几位,明白了!

字符串传递过去的是一个常量字符指针。<br /><br />把函数定义和声明的参数定义为const&nbsp;char&nbsp;*型,<br />或者在调用时强制成unsigned&nbsp;char&nbsp;*型都可以解决<br />RS232WriteStr((unsigned&nbsp;char&nbsp;*)&quot;OK&quot;);<br /><br />楼上有点不对,~~<br /><br />奇怪的是ADS里不需要extern声明也可以通过编译的,似乎还有点“自适应”功能,咔咔~
computer00 发表于 2009-1-18 10:46 | 显示全部楼层

keil也可以编译通过啊...也是给出警告

告诉你连接到没有定义的函数去了...<br /><br />***&nbsp;WARNING&nbsp;L2:&nbsp;REFERENCE&nbsp;MADE&nbsp;TO&nbsp;UNRESOLVED&nbsp;EXTERNAL
hotpower 发表于 2009-1-18 11:11 | 显示全部楼层

出现L2就在H文件中加extern void ...

H文件加&nbsp;extern&nbsp;void&nbsp;RS232WriteStr(const&nbsp;char&nbsp;*Pstr);<br /><br />C文件<br />void&nbsp;RS232WriteStr(const&nbsp;char&nbsp;*Pstr)<br />{<br />、、。。。。。<br />}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

368

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部