题
我移植一些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);
其他提示
不隶属于 StackOverflow