这两个C警告到底意味着什么?

这两个C警告到底意味着什么?,c,warnings,function-pointers,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 }; //

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

如果我理解您的代码,那么
m3\u funcs()
函数应该返回以NULL结尾的函数指针数组。实际上,您正在尝试使用初始值设定项(
{…}
)来声明数组并立即返回它。但我不认为你可以在变量声明之外使用初始值设定项。。。另外,请注意,此“变量”仅存在于
m3_funcs()
调用的上下文中,因此在函数返回后,可能最终返回的地址将不再有效

实现此功能的正确方法是使用静态全局变量并返回其地址:

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

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

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

如果我理解您的代码,那么
m3\u funcs()
函数应该返回以NULL结尾的函数指针数组。实际上,您正在尝试使用初始值设定项(
{…}
)来声明数组并立即返回它。但我不认为你可以在变量声明之外使用初始值设定项。。。另外,请注意,此“变量”仅存在于
m3_funcs()
调用的上下文中,因此在函数返回后,可能最终返回的地址将不再有效

实现此功能的正确方法是使用静态全局变量并返回其地址:

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

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

列表初始化将是:

a = { b,c,d }
这里要做的是使用新的通用初始化(
x{y}
)。因此,您试图用两个
m3\u func*
指针初始化单个
m3\u func**
指针。因此,你有两个警告:

  • 从不兼容的指针类型初始化(
    m3_func**
    !=
    m3_func*
  • 标量初始值设定项中的多余元素(指针是标量,您试图用两个指针对其进行初始化——因此一个多余)

  • 列表初始化将是:

    a = { b,c,d }
    
    这里要做的是使用新的通用初始化(
    x{y}
    )。因此,您试图用两个
    m3\u func*
    指针初始化单个
    m3\u func**
    指针。因此,你有两个警告:

  • 从不兼容的指针类型初始化(
    m3_func**
    !=
    m3_func*
  • 标量初始值设定项中的多余元素(指针是标量,您试图用两个指针对其进行初始化——因此一个多余)

  • 这些警告真正想告诉你的是,你可能应该在继续之前读一本关于C的介绍性书籍,然后请让我在十分钟内对自己进行L.O.L;“哦,天哪,我真傻,不明白这些简单的错误”:?我不认为typedef做了你所希望的….@awoodland将其更改为
    typedef void(*m3_func)(void)(并根据此更改更正上述代码),我会收到相同的警告。我想不是。那是很多lol的…这些警告真正想告诉你的是,你可能应该在继续之前读一本关于C的介绍性书籍,然后请让我在十分钟内对自己进行L.O.L;“哦,天哪,我真傻,不明白这些简单的错误”:?我不认为typedef做了你所希望的….@awoodland将其更改为
    typedef void(*m3_func)(void)(并根据此更改更正上述代码),我会收到相同的警告。我想不是。您有一个错误,第一行中的m3\u func应该是m3\u func*。谢谢你的回答,采纳了它:)哦,对不起,我会马上纠正这个。我可能犯了更多的错误,但希望你能理解……你有一个错误,第一行中的m3_func应该是m3_func*。谢谢你的回答,采纳了它:)哦,对不起,我会马上纠正这个。我可能犯了更多的错误,但希望你能明白。。。