函数指针转换参数为 void
Function pointer casting parameter to void
我为我的问题写了一个简单的demo(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
和returnsvoid*
的函数指针。但是,函数 foo
应该是一个接受三个 int 参数和 returns 一个 int 作为结果的函数。我认为 foo
的函数指针应该声明为 int (*ptr)(int, int, int) = foo;
之类的东西。为什么 _ptr_to_foo
中的转换有效?这里发生了什么?
c 风格的转换在类型检查方面相当松懈。您应该改用 static_cast
。编译失败:
return static_cast<SEL>(foo);
您可以将函数指针存储为错误的函数指针类型。
如果您将它们作为错误的函数指针类型调用,您的程序的行为将变为未定义的 C++ 标准。
你对 C 风格转换的使用变成了 reinterpret_cast<SEL>
,它可以做非常不安全的事情。
我为我的问题写了一个简单的demo(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
和returnsvoid*
的函数指针。但是,函数 foo
应该是一个接受三个 int 参数和 returns 一个 int 作为结果的函数。我认为 foo
的函数指针应该声明为 int (*ptr)(int, int, int) = foo;
之类的东西。为什么 _ptr_to_foo
中的转换有效?这里发生了什么?
c 风格的转换在类型检查方面相当松懈。您应该改用 static_cast
。编译失败:
return static_cast<SEL>(foo);
您可以将函数指针存储为错误的函数指针类型。
如果您将它们作为错误的函数指针类型调用,您的程序的行为将变为未定义的 C++ 标准。
你对 C 风格转换的使用变成了 reinterpret_cast<SEL>
,它可以做非常不安全的事情。