我写了以下代码:
struct DVDARRAY
{
int length;
pDVD* dvds;
};
typedef struct DVDARRAY DVDARRAY_t;
//...
int main()
{
int i;
char c;
DVDARRAY_t* dvds;
poDAOproperties props;
props = get_dao_properties();
dvds = (DVDARRAY_t*) DVDDAO_read_raw_filter(props, "id = 1");
printf("title->: %s", dvds->dvds[0]->title);
}
并在另一个文件中定义以下内容:
DVDARRAY_t* DVDDAO_read_raw_filter(poDAOproperties properties, char* filter)
{
DVDARRAY_t *dvds;
// ...some code...
dvds = malloc(sizeof(DVDARRAY_t));
// ...some code...
return dvds;
}
现在我的问题是:当我尝试编译这些文件时,我收到以下警告:
src/main.c: In Funktion »main«:
src/main.c:80:9: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
main.c的第80行就是那一行:
dvds = (DVDARRAY_t*) DVDDAO_read_raw_filter(props, "id = 1");
我该怎么办?
答案 0 :(得分:2)
您没有列出上面的文件名,因此我只需将其称为main.c
和dvd.c
。
在main.c
中,您调用其他未声明的函数DVDDAO_read_raw_filter
。这告诉编译器假设函数存在,具有未知(但是固定)的参数集,并且返回值为int
。
在dvd.c
中,您使用固定(和已知)参数定义函数DVDDAO_read_raw_filter
,返回类型DVDARRAY_t*
。 (大概你必须首先重复DVDARRAY_t
的定义。)
请注意,main.c
认为某些内容与DVDDAO_read_raw_filter
不符,即它返回类型为int
。这导致您的编译时诊断。幸运的是(你可以自己决定这是好运还是坏运气:-))尽管存在这种错误的信念,该计划仍然成功运行。
要解决此问题,请在调用之前告诉main.c
该函数,即声明它。您还可以通过将-Wimplicit-function-declaration
添加到编译时标志来从gcc获得更明确的警告。
通常,将struct
定义,typedef
和函数声明放入头文件(例如dvd.h
)然后#include
是个好主意使用定义和声明的各种C源文件中的标头。这样编译器可以将函数声明与函数定义进行比较,并且您不需要在多个struct
文件中重复typedef
s的内容和.c
的名称。