any012 发表于 2016-5-30 13:58:53

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

本帖最后由 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"后编译能通过?


Dylan疾风闪电 发表于 2016-5-31 08:33:48

提示错误:
..\..\User\spi.c(111):

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

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

wofei1314 发表于 2016-5-31 09:51:00

main函数中并未调用,所以不会判断

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

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

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中定义的函数的数据类型不一致造成的。
操作的数据类型不一致,当然会报错了。

dsjsjf 发表于 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

好多人都答非所问,楼主又不是问为什么错了,楼主问的是为什么错误会莫名其妙的消失
页: [1] 2
查看完整版本: 关于头文件里函数声明的问题。