7

我正在将一些 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()以接受 aPFN_FOO而不是 a void *”的效果的解决方案。这适用于这个简化的代码片段,但不适用于构建可能异构内容列表的实际代码。

4

2 回答 2

13

标准 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);
于 2009-10-12T21:41:17.270 回答
3

不应该写吗?

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

请参阅本教程

于 2009-10-12T20:29:07.813 回答