繁体   English   中英

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

[英]What do these two C warnings mean exactly?

有以下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_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_func*指针初始化单个m3_func**指针。 你有两个警告:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM