【问题标题】:Warning: cast to pointer from integer of different size警告:从不同大小的整数转换为指针
【发布时间】:2013-04-21 19:11:52
【问题描述】:

我写了以下代码:

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

我能做什么?

【问题讨论】:

  • 我不会说德语。您能否将错误消息翻译成英语、法语、拉丁语或匈牙利语?
  • 帮我们一个忙,发帖到 SO 时使用 LANG=C gcc
  • 两个文件中都定义了结构 DVDARRAY_t 吗?
  • 我认为调用函数时不需要额外的演员表。程序是否产生正确的输出?
  • DVDARRAY_t 在 DVD.h 中定义,它也包含在 main.c 和 DVDDAO.c 中...

标签: c pointers types casting


【解决方案1】:

您没有列出上面的文件名,所以我将它们称为main.cdvd.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 定义、typedefs 和函数声明放入头文件(例如,dvd.h),然后将 #include 该头放入各种 C 源文件中使用定义和声明。这样编译器可以将函数声明与函数定义进行比较,您无需在多个.c 文件中重复structs 的内容和typedefs 的名称。

【讨论】:

  • 我对 main.c 进行了很多部分的删减。所以你看不到 main.c 已经包含 DVDDAO.c (那是我的名字 ;-))
  • 你真的是对的。我在定义结构 DVD 的位置包含了“DVD.h”,但没有包含文件“DVDDAO.h”,感谢您的回答!
猜你喜欢
  • 2012-11-12
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 2019-08-13
相关资源
最近更新 更多