我为我的问题编写了一个简单的演示(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
中的转换有效?这里发生了什么?
最佳答案
您可以将函数指针存储为错误的函数指针类型。
如果您将它们调用为错误的函数指针类型,则 C++ 标准将无法定义程序的行为。
您对 C 风格强制转换的使用将变成 reinterpret_cast<SEL>
,这可能会做非常不安全的事情。
关于c++ - 函数指针将参数强制转换为 void,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53236955/