函数指针转换参数为 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>,它可以做非常不安全的事情。