如何使用没有错误或警告的函数指针初始化联合? 该代码针对嵌入式,必须在C和C ++中进行编译。
但是我遇到的问题是,直接初始化会产生与C指针不兼容的警告,并且在C ++中不赞成使用指定的初始化时,C ++中会出现错误。
在C和C ++中有没有警告和错误的方法吗?
最小示例:
struct List {
union {
int (*foo)(int num,int data);
int (*fee)(int num,float data);
};
};
int foo_fun(int pnum,int data);
int fee_fun(int pnum,float data);
static const struct List list[] = {
{
{foo_fun},},{
{fee_fun},/* C = warning: incompatible pointer types initializing 'int (*)(int,int)'
* with an expression of type 'int (int,float)'
*/
/* C++ = error: cannot initialize a member subobject of type 'int (*)(int,int)'
* with an lvalue of type 'int (int,float)':
* type mismatch at 2nd parameter ('int' vs 'float')
*/
},/* With C++ */
{
{.fee = fee_fun},/* ^^^^^^^^^^^^^
* C++ = warning: designated initializers are a C99 feature
*/
},};
该代码确实可以处理警告incompatible pointer types
或designated initializers are a C99 feature
。
粗略的方法是删除联合并使用空指针。但是,由于明显的缺点,这远远不在我的首选选项列表之内。
由alinsoar正确表示。在示例中当前省略的List中其他元素的工作是确保调用正确的函数。
指定的初始化将再次在C ++ 20中完全可用。
在此之前,它们不起作用。除了工会似乎仍然有效的地方。 (减去警告)