从已声明的函数创建函数指针

Make function pointer from an already declared function

本文关键字:函数 创建 指针 声明      更新时间:2023-10-16

我有一个声明为 int __stdcall MyFunction(int param, int param); 的函数,当名称作为参数传递时,我需要在宏或模板中获取指向该函数的指针类型。

这在C++中是可能的,还是我必须自己重写函数签名?

您可以通过以下方式为函数指针(它衰减到该指针,或由 address-of 运算符返回(创建类型别名:

#include <iostream>
int MyFunction(int param, int param1)
{
    std::cout << param << " " << param1 << std::endl;
    return 0;
}
using Myfunction_ptr_t = std::decay<decltype(MyFunction)>::type;
// or using Myfunction_ptr_t = decltype(&MyFunction);
// or using Myfunction_ptr_t = decltype(MyFunction) *;
int main()
{
    Myfunction_ptr_t Myfunction_ptr = MyFunction;
    Myfunction_ptr(1, 2);
}

此示例应改为使用 auto 说明符(自 C++ 11 起(:

auto Myfunction_ptr = MyFunction;

但这在不可推导的上下文中无济于事。

函数指针的行为与其他指针类似。它是一个指向某个实体(在本例中为函数代码(的内存地址。您可以将这些指针保存在某个地方,然后以任何方便您的情况的方式获取它们。

例如,您可以创建 std::string vs fun 的静态映射。 指针对:

static std::map<std::string, PTR_TYPE> funMap;

之后保存指向此地图的指针,并在需要时检索它们。

如果你还没有指针,你可能说的是从库中导出的函数。在这种情况下,请查看ldd用于基于*nix或somethig simialar用于其他平台。您需要搜索运行时链接器信息,并按名称查找 fnction。

实际上我不明白为什么你说你不能链接到这些功能。以标准方式执行此操作:包含带有此类声明的头文件。使用声明。链接器将为您完成工作。只需为它提供具有这些功能的库路径即可。它将动态链接到所需的功能。这就是你应该做的。如果你没有这样的库,你需要在运行时(再次(链接器的帮助下在运行时手动搜索函数。

您可以定义如下所示的typedef

typedef int (__stdcall *MYFUN)(int, int);

测试用例:

int main() {
  MYFUN f = MyFunction;
  f(2, 3);
}

或者,您可以使用std::function对象作为波纹管:

std::function<decltype(MyFunction)> myfun;

测试用例:

std::function<decltype(MyFunction)> myfun = MyFunction;
myfun(4, 5);

现场演示

知道了。 decltype(FunctionName)* pointer;会完成这项工作。

您可以使用

decltypeauto,如下所示

decltype(&FunctionName) pointer = &FunctionName;

auto pointer = &FunctionName;

我避免手动将函数指针转换为自己在 C++11 和 C++14 中键入:)