本帖最后由 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.c”文件的第111行代码处。所以和main没有关系的。
至于你在main中包含头文件后,使编译通过。那要从“spi.c”与main的关联去思考。
评分
查看全部评分
后面spi。c里调用了,传错参数了,自然是要报错的
既然知道是16位数组指针,为毛还用8位的形参?直接改成16位的不好吗?
如果不改的话,起码也加个强转....
评分
查看全部评分
其实error#167是一个非常负责的错误提示,早期编译器可能不会在这个上面处理的那么细致。你看即使现在处理了也很难处理完整。
操作的数据类型不一致,当然会报错了。
评分
查看全部评分
顶楼上的
我本来想见识以下你说的奇观,可惜没见识到。我用的是keil 5.16a版本,不管注释不注释,都会报错。
我不知道你是什么版本,居然会出现这样的情况。
其实不管报错不报错,最重要的是自己知道这样写代码是不严谨的,不报错不代表不出错。
评分
查看全部评分
感谢.
我用的是5.14版本.
不纠结这个问题了,继续解决其他问题.
函数本身有问题,才会报错,函数本身没问题,系统就认为没错,调用的时候你不按照事先给系统说的(原来函数定义的格式)做,系统自然不干了,这不是欺负人吗,开始告诉我这个,后来给个别的参数,不干,罢工.....
于是乎就有了你后面的结果
问题出在,函数定义时参数指定的是8位指针,而调用时给的是16位指针.
强制转换后编译通过了.
好奇的是没有强制转换的时候,在main.c里加上#include "crc.h"也能通过编译.
可能是我编译器版本的问题.楼上的那位好心的朋友,编译时两种情况下都通不过.