正确转换为函数指针,指向返回函数的函数

时间:2017-04-28 01:05:05

标签: c++ visual-c++ c++14 function-pointers

我正在逆转源代码,我发现了一个看起来像这样的函数:

考虑一下:

int examplefn(int x) { return x * 4; }

int (*rtx())(int)
{
    return examplefn;
}

好吧,然后我需要对rtx()做一个指针函数来做钩子,然后 我做过这样的事情:

int (*fncptr())(int) = (int(*())(int))0xC0FFEE; 
/* 0xC0FFEE it's a sample of the memory address of the function...*/

但是我的编译器没有编译它,然后我尝试了:

typedef int(*fnc_t())(int);

// Clearer example pointing to rtx

fnc_t* TRY_2 = (fnc_t*)&rtx;

// then has successfully compiled, ex test...

 int main()
 {
    std::cout << TRY_2()(4) << std::endl; // output: 16 ok.
 }

好吧,我要说明问题,¿如何在不使用typedef的情况下进行正确的施法?

我在互联网上搜索过,但我找不到任何东西......

2 个答案:

答案 0 :(得分:6)

为什么要避免使用typedef?它使代码更容易理解:

using F = int(*)(int); // pointer to function taking int and returning int
using G = F(*)();      // pointer to function taking nothing and returning
                       //   a pointer to function taking int and returning int

这让我没有时间写作,其他人没有时间阅读和理解。我称之为胜利。

答案 1 :(得分:5)

(int(*())(int))是一种函数类型(与函数rtx的类型相同)。您的代码尝试声明一个函数,并将一个整数转换为函数。但是你实际上想要处理指向这样一个函数的指针。

typedef int(*fnc_t())(int);之后,通过在typedef:fnc_t *x;中将fnc_t替换为(*x),可以找到相当于int (*(*x)())(int)的内容。所以你的代码可能是:

int (*(*fncptr)())(int) = (int(*(*)())(int))0xC0FFEE; 

在实际代码中使用一系列typedef s(或等效的using s)当然更可取。