C++ 函数指针将参数转换为void

C++ 函数指针将参数转换为void,c++,casting,function-pointers,calling-convention,reinterpret-cast,C++,Casting,Function Pointers,Calling Convention,Reinterpret Cast,我为我的问题编写了一个简单的演示(test.cpp): #include <stdio.h> typedef void* (*SEL)(void); int foo(int a, int b, int c) { return a + b + c; } SEL _ptr_to_foo() { return (SEL)foo; } int main() { SEL sel = _ptr_to_foo(); return 0; } #包括 类型定义无

我为我的问题编写了一个简单的演示(test.cpp):

#include <stdio.h>
typedef void* (*SEL)(void);

int foo(int a, int b, int c) {
    return a + b + c;
}

SEL _ptr_to_foo() {
    return (SEL)foo;
}
int main() {
    SEL sel = _ptr_to_foo();

    return 0;
}
#包括
类型定义无效*(*SEL)(无效);
int foo(int a、int b、int c){
返回a+b+c;
}
SEL_ptr_to_foo(){
返回(SEL)foo;
}
int main(){
SEL=_ptr_to_foo();
返回0;
}
我用osx中的
g++test.cpp-o test
编译了它,编译器没有任何抱怨


但我对这里发生的事感到困惑。我认为,
SEL
定义函数指针,该指针的参数是
void
,并返回
void*
。但是,函数
foo
应该是一个接受三个int参数并返回一个int作为结果的函数。我认为
foo
的函数指针应该声明为
int(*ptr)(int,int,int)=foo。为什么
\u ptr\u to\u foo
中的角色转换有效?这里发生了什么?

c样式转换的类型检查相当松散。您应该改为使用
static\u cast
。这无法编译:

return static_cast<SEL>(foo);
返回静态_cast(foo);

您可以将函数指针存储为错误的函数指针类型

如果调用它们为错误函数指针类型,程序的行为将由C++标准定义。< /P>
使用C型强制转换将成为一种重新解释强制转换,这可能会造成非常不安全的后果。

“有效”是相对的
SEL
foo()
@swardfish不兼容我试图通过SEL调用我的foo,但由于参数错误而失败。似乎SEL在foo中丢弃了我的参数信息。这是否意味着您的评论中的
不兼容
?尤其是C风格的演员?为什么你不使用正确的类型?它是因为C++语言允许的。它允许这样做,因为您可能希望将函数指针存储在不同的类型下,然后根据存储在其中的其他信息进行回溯。好的,这一个失败了。我应该把这个c风格的演员阵容看作是一个bug吗?不,它不是bug,它是设计出来的。在C++中使用<代码> RealTytRask将允许您这样做…愚蠢的事。