【问题标题】:What do these two C warnings mean exactly?这两个 C 警告究竟是什么意思?
【发布时间】:2011-08-30 15:02:46
【问题描述】:

有以下 C 代码:

typedef void*(m3_func)(void);
#define NULL ((void*)0)

char* lolinfo()
{
    return "You got the additional info! :D";
}

m3_func** m3_funcs() {
    return (m3_func**) {
        (m3_func*)(&lolinfo), // warning #1
        NULL
    }; // warning #2
}

我收到以下警告:

  • /home/lk/proj/m3/m3_lolauncher/lolauncher.c(0,0):警告:从不兼容的指针类型初始化(m3_lolauncher)
  • /home/lk/proj/m3/m3_lolauncher/lolauncher.c(0,0):警告:标量初始化程序中的元素过多 (m3_lolauncher)

我不明白第一个,因为我正确投射?

我从没见过第二个...

【问题讨论】:

  • 这是很多哈哈的...
  • 这些警告真正想告诉你的是,在进一步学习之前,你可能应该阅读一本关于 C 的介绍性书籍
  • 那么请让我大声笑。十分钟后我自己; “哦,伙计,我是不是很笨,不理解这些简单的错误”:)?
  • 我不认为 typedef 能如你所愿......
  • @awoodland 将其更改为typedef void(*m3_func)(void);(并根据此更改使上述代码正确),我得到相同的警告。我猜不是。

标签: c warnings function-pointers


【解决方案1】:

您的示例代码似乎不是有效的 C。

如果我理解您的代码,m3_funcs() 函数应该返回一个以 NULL 结尾的函数指针数组。您实际上是在尝试使用初始化程序 ({...}) 来声明一个数组并立即返回它。但我不认为你可以在变量声明之外使用初始化器......另外,请注意这个“变量”只存在于m3_funcs()调用的上下文中,所以最终可能返回的地址不会函数返回后更有效。

实现这样一个特性的正确方法是拥有一个静态全局变量,并返回它的地址:

static m3_func *m3_funcs_array[] = {(m3_func *)&lolinfo, NULL};

m3_func ** m3_funcs()
{
    return &m3_funcs_array;
}

【讨论】:

  • 你有一个错误,你第一行的 m3_func 应该是 m3_func*。谢谢你的回答,采纳了:)
  • 哎呀,对不起,我会马上纠正这个问题。我可能犯了更多的错误,但希望你明白......
【解决方案2】:

列表初始化是:

a = { b,c,d }

您在这里所做的是使用新的通用初始化 (x{y})。因此,您尝试使用两个 m3_func* 指针初始化单个 m3_func** 指针。因此,您有两个警告:

  1. 从不兼容的指针类型初始化 (m3_func** != m3_func*)
  2. 标量初始值设定项中的多余元素(指针是标量,而您正尝试使用两个指针对其进行初始化 -- 一个过多的)

【讨论】:

    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 2011-03-12
    • 2014-10-29
    • 2016-01-27
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多