我为我的问题写了一个简单的演示(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;
}
并且我在osx中使用g++ test.cpp -o test
对其进行了编译,编译器对此没有任何抱怨。
但是我对这里发生的事情感到困惑。我认为SEL
定义了函数指针,该参数的参数为void
,并返回void*
。但是,函数foo
应该是一个接受三个int参数并返回int作为结果的函数。我认为foo
的函数指针应声明为类似int (*ptr)(int, int, int) = foo;
的东西。为什么_ptr_to_foo
中的转换有效?这里发生了什么事?
答案 0 :(得分:3)
您可以将函数指针存储为错误的函数指针类型。
如果您将它们称为错误的函数指针类型,则C ++标准将无法定义程序的行为。
您使用C样式的强制转换会变成reinterpret_cast<SEL>
,这可能会做非常不安全的事情。
答案 1 :(得分:2)
c风格的类型转换在类型检查方面相当宽松。您应该改用static_cast
。无法编译:
return static_cast<SEL>(foo);