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

标签 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 中的转换有效?这里发生了什么?

最佳答案

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

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

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

关于c++ - 函数指针将参数强制转换为 void,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53236955/

相关文章:

c# - 来自 C# : why do I have to override new/delete? 的 mingw DLL

c++ - MinGW 和 __uuidof

php - PDO::PARAM_* 与强制转换

objective-c - 执行选择器转换

c++ - 随机洗牌和函数指针

c - 将函数指针名称传递给 C 预处理器

c++ - 先进先出实现

java - 单击按钮时如何在Java中的运行时强制转换对象

c++ - 将 for_each 调用的函数放在类中的什么位置?

c++ - 64 位浮点移植问题