gpt4 book ai didi

c - 在指针和函数指针之间进行类型转换时发出警告

转载 作者:太空狗 更新时间:2023-10-29 17:17:07 25 4
gpt4 key购买 nike

我正在将一些 C 代码移植到 TI DSP 芯片环境。我正在努力使用 C 编译器。

我有一个包含函数指针的数据结构。我有一个初始化数据结构的函数。像这样:

typedef void (*PFN_FOO)(int x, int y);

struct my_struct
{
PFN_FOO pfn;
};

init_struct(struct my_struct *p, void *pfn)
{
p->pfn = (PFN_FOO)pfn;
}

在 Visual Studio 和 GCC 下,这种代码可以毫无怨言地编译。事实上,因为 pfn 参数是 void * 类型,所以我什至不需要在那里进行强制转换;它会毫无怨言地隐含地转换。

在 TI DSP 芯片的 Code Composer Studio 中,我收到“警告:类型转换无效”

我的政策是让我的代码在没有警告的情况下编译,所以我想解决这个问题。我尝试过各种类型转换。我发现如果我先将 void * 指针转换为 int,然后将其转换为正确的类型,编译器会非常满意。额,恶心!

我如何在没有编译器提示的情况下执行此转换?我真的必须强制转换为 int 才能关闭编译器吗?

注意:我特别不是寻找解决方案来解决“更改 init_struct() 以接受 PFN_FOO 而不是无效 *”。这适用于这个简化的代码片段,但不适用于实际代码,它构建了一个可能异构的列表。

最佳答案

标准 C 特别不支持数据对象指针和函数指针之间的转换。 GCC 和 Visual Studio 支持将其作为扩展。

如果你想让你的函数符合标准(但仍然使用 void * 参数),你可以传递一个指向函数指针的指针。这是可行的,因为函数指针本身是普通对象,所以指向函数指针的指针可以与 void * 相互转换就很好:

init_struct(struct my_struct *p, void *pfn)
{
PFN_FOO *foo = pfn;
p->pfn = *foo;
}

然后调用者必须创建一个临时的 PFN_FOO 对象以在调用时传递一个指针:

PFN_FOO fp = &somefunc;
/* ... */
init_struct(p, &fp);

关于c - 在指针和函数指针之间进行类型转换时发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1556651/

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