gpt4 book ai didi

c++ - C 和 C++ 的 union 函数指针初始化

转载 作者:行者123 更新时间:2023-12-02 06:04:37 26 4
gpt4 key购买 nike

如何使用函数指针初始化 union 而不出现错误或警告?该代码针对嵌入式,必须用 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
*/
},

};

该代码确实可以处理警告不兼容的指针类型指定的初始值设定项是 C99 功能

最粗略的方法是放弃 union 并使用 void 指针。然而,由于明显的缺点,它远远落在我的首选选项列表中。

alinsoar 的评论正确。确保调用正确的函数是示例中当前省略的 List 中其他元素的工作。

<小时/>

指定初始化将在 C++20 中再次完全可用。
在那之前它们没有任何作用。除了 union ,他们似乎仍在工作。 (减去警告)

最佳答案

在 C++ 中(C++20 之前)中,初始化第一个 union 成员之后的唯一方法是 union 中的构造函数。

在 C 中初始化第一个 union 成员之外的唯一方法是指定的初始值设定项。

这并没有留下很大的回旋余地。当心,前面的丑陋:

// For convenience
typedef int (*fooPtr)(int, int);
typedef int (*feePtr)(int, float);


#ifndef __cplusplus
#define INITIALIZE(x) .x =
#else
#define INITIALIZE(x)
#endif


struct List {
union X {
#ifdef __cplusplus
constexpr X(fooPtr foo_) : foo(foo_) {}
constexpr X(feePtr fee_) : fee(fee_) {}
#endif
fooPtr foo;
feePtr fee;
} x;
};

int foo_fun(int pnum, int data);
int fee_fun(int pnum, float data);

static const struct List list[] = {
{
{INITIALIZE(foo) foo_fun},
},
{
{INITIALIZE(fee) fee_fun},
},
};

https://godbolt.org/z/pd42HT

关于c++ - C 和 C++ 的 union 函数指针初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59085023/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com