0

我写了以下代码:

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");

我能做些什么?

4

1 回答 1

2

您没有列出上面的文件名,所以我只会称它们main.cdvd.c.

main.c中,您调用了其他未声明的函数DVDDAO_read_raw_filter。这告诉编译器假设该函数存在,具有未知(但固定)的参数集,并且具有类型的返回值int

dvd.c您定义DVDDAO_read_raw_filter具有固定(和已知)参数的函数时,返回 type DVDARRAY_t*。(大概你必须重复DVDARRAY_tfirst 的定义。)

请注意,它main.c相信一些不真实的东西DVDDAO_read_raw_filter,即它具有返回类型int。这会导致您的编译时诊断。运气好(你可以自己决定这是好运还是坏运:-))尽管有这种错误的信念,程序还是成功运行。

要解决此问题,main.c请在调用函数之前说明该函数,即声明它。-Wimplicit-function-declaration您还可以通过添加编译时标志从 gcc 获得更明确的警告。

struct通常,将定义、typedefs 和函数声明放入头文件(例如dvd.h)中,然后#include将该头放入使用定义和声明的各种 C 源文件中是一个好主意。这样编译器可以将函数声明与函数定义进行比较,您无需在多个文件中重复 s 的内容和structs 的名称。typedef.c

于 2013-04-21T19:57:42.573 回答