函数指针将参数强制转换为void

时间:2018-11-10 07:38:03

标签: 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;
}

并且我在osx中​​使用g++ test.cpp -o test对其进行了编译,编译器对此没有任何抱怨。

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

2 个答案:

答案 0 :(得分:3)

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

如果您将它们称为错误的函数指针类型,则C ++标准将无法定义程序的行为。

您使用C样式的强制转换会变成reinterpret_cast<SEL>,这可能会做非常不安全的事情。

答案 1 :(得分:2)

c风格的类型转换在类型检查方面相当宽松。您应该改用static_cast。无法编译:

return static_cast<SEL>(foo);