关于函数指针转换的有趣问题

Dre*_*erX 0 c++ function-pointers type-conversion

我对函数指针转换做了一个有趣的测试:

typedef bool (*BFUNC)(int n);
typedef int  (*IFUNC)(int n);
typedef double (*DFUNC)(int n);

void vfunc(int n)
{
    n++;
}

int _tmain(int argc, _TCHAR* argv[])
{
    BFUNC f = (BFUNC)vfunc;
    IFUNC f2 = (IFUNC)vfunc;
    DFUNC f3 = (DFUNC)vfunc;

    bool bRet = f(0);
    int nRet = f2(0);
    double dRet = f3(0);

    printf("bRet=%d, nRet=%d\n", bRet, nRet); // bRet=1, nRet=1

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

第一件有趣的事情是这段代码编译并运行良好。第二个有趣的事情是我实际上得到了返回值,目前似乎是1。(我用的是很老的VS2010,不知道有没有关系)

我想知道发生了什么事?

我做了一些更多的实验,似乎只要我使用这种 C 风格的显式转换,那么我就可以很自由地将一个函数指针类型转换为另一个函数指针类型,我想知道这是否有实际意义?其基本原理是什么?

Mes*_*kon 5

static_cast这就是 C 风格转换被 C++ 风格转换( 、 、 ...)取代的原因reinterpret_cast

C 风格转换将尝试按预定顺序执行任何 C++ 风格转换。在您的情况下,C 风格的强制转换相当于reinterpret_cast. 因此演员工作正常。

reinterpret_cast通过在将函数转换为指向不兼容函数签名的指针后调用该函数,您将调用未定义的行为。关于返回值的任何讨论都是没有意义的,因为这纯粹是未定义的行为,因此可能会导致任何情况发生。

(但是如果你绝对想知道为什么返回值是1,那么可能是因为该n++操作会将其结果存储在预期存储返回值的堆栈上。毕竟,这个函数没有返回值,那么为什么要为其保留堆栈空间呢?)。