![](/img/trans.png)
[英]What does it mean exactly if two types are “compatible” to each other in 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
}
我收到这些警告:
因为我正确投射,我不明白第一个?
我从未见过第二个......
看来你的示例代码无效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**
指针。 你有两个警告:
m3_func**
!= m3_func*
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.