打印

关于ADS编译

[复制链接]
3146|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
箫笑|  楼主 | 2009-1-17 21:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
发现ADS与Keil对C的编译有点不同,按照以前的习惯是把函数声明放在XX.h里,定义放在XX.c里,

刚刚用C写了个arm的串口打印字符串的程序,原型是
void RS232WriteStr(unsigned char *Pstr);

开始时忘记声明函数了,在另外一个文件里这样调用这个函数
RS232WriteStr("OK");
编译时竟然只是警告,运行没有问题,后来发现问题,把声明写进来,竟然是错误,无法通过编译。
implicit cast of pointer to non-equal pointer

请问这是什么道理呢?

相关帖子

沙发
阿南| | 2009-1-17 21:40 | 只看该作者

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

使用特权

评论回复
板凳
箫笑|  楼主 | 2009-1-17 21:45 | 只看该作者

re

嗯,是把声明的头文件包含进定义的C文件,
先声明,然后定义,这样子会有问题吗?

使用特权

评论回复
地板
箫笑|  楼主 | 2009-1-17 21:48 | 只看该作者

re

我也试过不在头文件里加声明,直接在要调用函数的那个文件里加入
extern声明,编译结果都是一样的。

使用特权

评论回复
5
zyok| | 2009-1-17 22:05 | 只看该作者

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

行吗?

使用特权

评论回复
6
箫笑|  楼主 | 2009-1-17 22:09 | 只看该作者

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

之前在keil里是这样写的,而且ADS里不声明也是可以打印字符的,问题就是声明了反而出问题了。

使用特权

评论回复
7
阿南| | 2009-1-17 22:21 | 只看该作者

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

使用特权

评论回复
8
computer00| | 2009-1-17 22:38 | 只看该作者

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

传递进去的是常量char型,所以你的定义和声明要加上const...

要用const char *,而不是unsigned char *………………

使用特权

评论回复
9
洪七公| | 2009-1-17 22:43 | 只看该作者

void RS232WriteStr(const char *Pstr);


RS232WriteStr((const char *)"OK");


使用特权

评论回复
10
箫笑|  楼主 | 2009-1-18 10:40 | 只看该作者

多谢楼上几位,明白了!

字符串传递过去的是一个常量字符指针。

把函数定义和声明的参数定义为const char *型,
或者在调用时强制成unsigned char *型都可以解决
RS232WriteStr((unsigned char *)"OK");

楼上有点不对,~~

奇怪的是ADS里不需要extern声明也可以通过编译的,似乎还有点“自适应”功能,咔咔~

使用特权

评论回复
11
computer00| | 2009-1-18 10:46 | 只看该作者

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

告诉你连接到没有定义的函数去了...

*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL

使用特权

评论回复
12
hotpower| | 2009-1-18 11:11 | 只看该作者

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

H文件加 extern void RS232WriteStr(const char *Pstr);

C文件
void RS232WriteStr(const char *Pstr)
{
、、。。。。。
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

368

帖子

0

粉丝