现在有一个头文件Clarke.h,代码如下:
源文件源文件Clarke.c(源文件#include了头文件),代码如下:
当本人把这些代码复制到VS2013中时,写了个主函数,如下:
但编译时会报错,如下:
报错的意思,本人理解的是,typedef struct 中定义的,名为CLARKE 结构体,里面有void(*calc)( ) 。这个函数指针,是没有参数的,但是用CLARKE_DEFAULTS,去初始化的时候,CLARKE_DEFAULTS里面的函数clarke_calc( ),它是有参数值的,参数为,一个指向CLARKE类型的结构体的指针,所以不能这么初始化。
于是,本人把 CLARKE 这个结构体, 改成如下:
也就是将CLARKE 结构体里定义的函数指针void(*calc)( ),加上一个参数,变成void(*calc)( CLARKE_handle ),对于这个CLARKE_handle ,有 typedef CLARKE * CLARKE_handle 。
但此时,编译,依旧报错,如下:
问一下这是怎么回事啊?谢谢大家
源文件源文件Clarke.c(源文件#include了头文件),代码如下:
当本人把这些代码复制到VS2013中时,写了个主函数,如下:
但编译时会报错,如下:
报错的意思,本人理解的是,typedef struct 中定义的,名为CLARKE 结构体,里面有void(*calc)( ) 。这个函数指针,是没有参数的,但是用CLARKE_DEFAULTS,去初始化的时候,CLARKE_DEFAULTS里面的函数clarke_calc( ),它是有参数值的,参数为,一个指向CLARKE类型的结构体的指针,所以不能这么初始化。
于是,本人把 CLARKE 这个结构体, 改成如下:
也就是将CLARKE 结构体里定义的函数指针void(*calc)( ),加上一个参数,变成void(*calc)( CLARKE_handle ),对于这个CLARKE_handle ,有 typedef CLARKE * CLARKE_handle 。
但此时,编译,依旧报错,如下:
问一下这是怎么回事啊?谢谢大家
解决方案
20
void(*calc)( Uint32); // 改成这样,C和C++都是强类型语言,不符合定义编译不过
40
CLARKE *和Unit32可以通过强转来通过调用,他两的内存模型是一样的即为4字节的地址
那问一下一下,(void(*)(Uint32))clarke_calc , 是什么意思啊?
void(*)(Uint32) 是一个函数指针,指针指向参数为Uint32,无返回的函数
不同类型的指针是不能隐式转换的
在这里是做强制转换,让他转换成这种类型函数指针
正如(int)a 就是将a转换成int类型