我正在将一些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;
}
Run Code Online (Sandbox Code Playgroud)
在Visual Studio和GCC下,这种代码无需投诉即可编译.事实上,因为pfn论证是类型void *我不需要在那里投一个演员; 它会毫无怨言地隐含地施放.
在用于TI DSP芯片的Code Composer Studio中,我收到"警告:无效类型转换"
我的策略是让我的代码在没有警告的情况下编译,所以我想解决这个问题.我尝试了各种各样的铸造.我发现编译器非常高兴,如果我将void *指针指向intfirst,然后将其转换为正确的类型.哎呀!
如果没有编译器抱怨,我怎么能这样做?我是否真的必须转向int关闭编译器?
注意:我特别没有找到"改变init_struct()接受PFN_FOO而不是"的效果的解决方案void *.这适用于这个简化的代码片段,但不适用于实际代码,它构建了可能异构的东西列表.
caf*_*caf 12
标准C特别不支持指向数据对象的指针和指向函数的指针之间的转换.GCC和Visual Studio支持此作为扩展.
如果要使函数符合标准(但仍然使用void *参数),则可以将指针传递给函数指针.这是有效的,因为函数指针本身是普通的对象,所以指向函数指针的指针可以void *很好地转换为:
init_struct(struct my_struct *p, void *pfn)
{
PFN_FOO *foo = pfn;
p->pfn = *foo;
}
Run Code Online (Sandbox Code Playgroud)
然后调用者必须创建一个临时PFN_FOO对象,以便在进行调用时传递指针:
PFN_FOO fp = &somefunc;
/* ... */
init_struct(p, &fp);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5210 次 |
| 最近记录: |