Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在指针和函数指针之间进行类型转换时出现警告_C_Casting_Ti Dsp - Fatal编程技术网

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

我正在将一些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;
}
在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。没错,您可以在不同的函数指针类型之间自由转换。