我移植一些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 *我并不真的需要甚至把铸有;它只是隐式转换毫无怨言。

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

我的政策是让我的代码编译没有警告,所以我想解决这个问题。我已经试过各种铸件。我发现,编译器,如果我投我void *指针先int,然后将其转换为正确的类型非常高兴。 EW,呸!

我怎样才能做到这一点的转换,不编译器抱怨?难道我真的要转换为int闭嘴编译器?

请注意:我是特别的的寻找解决的效应“改变init_struct()接受,而不是一个PFN_FOO void *”。将工作对于该简化的代码段,但不会对实际的代码,它建立的可能不同内容的列表的工作。

有帮助吗?

解决方案

标准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);

其他提示

如果不是你写的?

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

请参阅此教程

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top