有以下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
}
我收到了这些警告:
我不理解第一个,因为我正确投射?
我从未见过第二个......
答案 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*
指针。你有两个警告:
m3_func**
!= m3_func*
)