这两个C警告究竟意味着什么?

时间:2011-08-30 15:02:46

标签: c warnings function-pointers

有以下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)

我不理解第一个,因为我正确投射?

我从未见过第二个......

2 个答案:

答案 0 :(得分:3)

您的示例代码似乎无效C.

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

实现此类功能的正确方法是拥有一个静态全局变量,并返回其地址:

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

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

答案 1 :(得分:1)

列表初始化将是:

a = { b,c,d }

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

  1. 从不兼容的指针类型(m3_func**!= m3_func*
  2. 进行初始化
  3. 标量初始值设定项中的多余元素(指针是一个标量,你试图用两个指针初始化它 - 一个过多的错误)