C 在指针和函数指针之间进行类型转换时出现警告
我正在将一些C代码移植到TI DSP芯片环境中。我正在努力学习C编译器 我有一个数据结构,包括一个指向函数的指针。我有一个初始化数据结构的函数。大概是这样的:C 在指针和函数指针之间进行类型转换时出现警告,c,casting,ti-dsp,C,Casting,Ti Dsp,我正在将一些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; } 在VisualStud
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;
}
在VisualStudio和GCC下,这类代码可以毫无怨言地编译。事实上,因为pfn
参数的类型是void*
,所以我甚至不需要在那里进行强制转换;它只是含蓄地投下,没有怨言
在TI DSP芯片的Code Composer Studio中,我看到“警告:无效类型转换”
我的策略是让我的代码在没有警告的情况下编译,所以我想解决这个问题。我试过各种类型的演员。我发现,如果我先将void*
指针转换为int
,然后将其转换为正确的类型,编译器会非常高兴。呃,恶心
我怎样才能在没有编译器抱怨的情况下进行此转换?我真的必须转换到int
才能关闭编译器吗
注意:我并不是在寻找一个解决方案,来解决“更改init_struct()
以接受PFN_FOO
而不是void*
”的效果。这对这个简化的代码片段有效,但对实际的代码无效,因为实际的代码构建了一个可能的异构内容列表。您不应该编写吗
typedef void (*PFN_FOO)(int x, int y);
参见此。标准C特别不支持指向数据对象的指针和指向函数的指针之间的转换。GCC和VisualStudio支持将其作为扩展 如果要使函数符合标准(但仍使用
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);
呃,对。我在实际代码中有正确的代码,我将把我愚蠢的示例代码更改为正确的。现在,您对实际问题有什么建议吗?只是想澄清一下:您可能怀疑问题是我的代码没有正确声明PFN_FOO类型。这不是问题,代码实际上工作得很好,但是TI DSP C编译器给我警告。你编译为C还是C++?如果这是C++,我就不必乱弄这些东西了。我可以使用虚拟指针,C++会为我做所有的工作。只要有正确的类型协议,使PFN类型PFNYFO就不是那么简单吗?另一点-应该给init_struct()一个显式类型;在VC++2008中,即使使用C编译,也不会在没有警告的情况下编译。@Clifford,我的实际代码总是在函数上有显式类型;我编写代码是为了在没有任何警告的情况下进行编译,而且我对类型很小心。我要解决的问题是创建一个初始化数据结构的函数,该数据结构中可以包含异构内容,我想要一个单一的init函数,而不是每个可能存储在其中的数据类型都有一个init函数。哇,我想这是一个TI C的东西,但你告诉我这是一个C标准的东西。这很有帮助。好的,我重写了我的函数,这样它就不用了
void*
,而是使用了PFN
,定义如下:typedef void(*PFN)()代码>现在代码编译时没有警告。在转换为特定的PFN类型之前,它以某种指向函数的指针开始就足够了。非常感谢。答案接受和+1。没错,您可以在不同的函数指针类型之间自由转换。