你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于头文件里函数声明的问题。

[复制链接]
any012 提问时间:2016-5-30 13:58 /
本帖最后由 any012 于 2016-5-31 12:38 编辑

在crc.c文件里定义了这么一个函数,crc.h文件里也只有这个函数的声明。
u16 getCRC16(volatile u8 *ptr, u8 len);

在另一个.c文件里的某个函数调用该函数,并在.c文件开始时#include crc.h。不过第一个参数给的是16位数组的指针。
编译时,提示错误:
..\..\User\spi.c(111): error:  #167: argument of type "u16 *" is incompatible with parameter of type "u8 *"

然后,在主程序main.c里,加入include "crc.h",编译就通过了。
请教:main.c里并没有直接调用 getCRC16(),为何加入了相应的头文件就可以编译了?


-------------------------------------------------------------

更新上传下工程文件.
还是想不通,为什么在main.c里 include "crc.h"后编译能通过?

SPI从模式测试.zip (4.4 MB, 下载次数: 6)
收藏 评论17 发布时间:2016-5-30 13:58

举报

17个回答
Dylan疾风闪电 最优答案 回答时间:2016-5-31 08:33:48
提示错误:
..\..\User\spi.c(111):


错误提示中说明的很明白,错误位置位于“spi.c”文件的第111行代码处。所以和main没有关系的。

至于你在main中包含头文件后,使编译通过。那要从“spi.c”与main的关联去思考。

评分

参与人数 1ST金币 +2 收起 理由
肖久 + 2

查看全部评分

wofei1314 最优答案 回答时间:2016-5-31 09:51:00
main函数中并未调用,所以不会判断

后面spi。c里调用了,传错参数了,自然是要报错的

既然知道是16位数组指针,为毛还用8位的形参?直接改成16位的不好吗?
如果不改的话,起码也加个强转....

评分

参与人数 1ST金币 +2 收起 理由
肖久 + 2

查看全部评分

moyanming2013 最优答案 回答时间:2016-6-2 10:58:57
“非常危险的”默认类型转换,多个包含头文件可能会优先用main.c里面的(不知道你对crc.h加预编译指示了没有),而这里面仅仅是让编译器获取一个指针信息,指针的大小和类型在C中都是4字节和void*的,故后面再调用就不显示错误了。
其实error#167是一个非常负责的错误提示,早期编译器可能不会在这个上面处理的那么细致。你看即使现在处理了也很难处理完整。
huaiqiao 回答时间:2016-5-31 10:26:10
我觉的是因为你在spi.c中调用这个getCRC16函数的时候,第一个参数的数据类型和 crc中定义的函数的数据类型不一致造成的。
操作的数据类型不一致,当然会报错了。

评分

参与人数 1ST金币 +2 收起 理由
肖久 + 2

查看全部评分

埃斯提爱慕 回答时间:2016-5-31 08:38:10
提示: 作者被禁止或删除 内容自动屏蔽
人之颠 回答时间:2016-5-31 08:42:51
数据指针的格式不一样,操作结果就会出错,
wenyangzeng 回答时间:2016-5-31 10:48:47
u8和u16数据类型不一致所致, "crc.h"里可能重新定义了。
zjg_lizhen 回答时间:2016-5-31 11:09:48

顶楼上的
荣丰宇 回答时间:2016-5-31 13:21:01
可能是getCRC16中u8与u16定义冲突了?
潇潇雨歇pku 回答时间:2016-5-31 15:39:21
好多人都答非所问,楼主又不是问为什么错了,楼主问的是为什么错误会莫名其妙的消失
潇潇雨歇pku 回答时间:2016-5-31 16:19:38
同学,我觉得你不要纠结这个问题了。
我本来想见识以下你说的奇观,可惜没见识到。我用的是keil 5.16a版本,不管注释不注释,都会报错。
QQ截图20160531161658.png
我不知道你是什么版本,居然会出现这样的情况。

其实不管报错不报错,最重要的是自己知道这样写代码是不严谨的,不报错不代表不出错。

评分

参与人数 1ST金币 +2 收起 理由
肖久 + 2

查看全部评分

any012 回答时间:2016-5-31 16:31:12
潇潇雨歇pku 发表于 2016-5-31 16:19
同学,我觉得你不要纠结这个问题了。
我本来想见识以下你说的奇观,可惜没见识到。我用的是keil 5.16a版本 ...

感谢.
我用的是5.14版本.
不纠结这个问题了,继续解决其他问题.
wofei1314 回答时间:2016-5-31 17:18:46
main里包含的是 crc.h,而crc.h又没写错,为啥要报错?没出错自然能编译通过!

函数本身有问题,才会报错,函数本身没问题,系统就认为没错,调用的时候你不按照事先给系统说的(原来函数定义的格式)做,系统自然不干了,这不是欺负人吗,开始告诉我这个,后来给个别的参数,不干,罢工.....

于是乎就有了你后面的结果
any012 回答时间:2016-5-31 17:37:59
wofei1314 发表于 2016-5-31 17:18
main里包含的是 crc.h,而crc.h又没写错,为啥要报错?没出错自然能编译通过!

函数本身有问题,才会报错, ...

问题出在,函数定义时参数指定的是8位指针,而调用时给的是16位指针.
强制转换后编译通过了.

好奇的是没有强制转换的时候,在main.c里加上#include "crc.h"也能通过编译.
可能是我编译器版本的问题.楼上的那位好心的朋友,编译时两种情况下都通不过.
zcl201207 回答时间:2016-5-31 23:44:57
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版