【问题标题】:how to dynamically call a function in c++如何在c++中动态调用函数
【发布时间】:2012-02-13 20:09:42
【问题描述】:

除了 boost (Bind & Function),我如何在 C++ 中动态调用函数?

PHP 有:

$obj = new MyObject();
$function = 'doSomething';
$obj->$function();

Objective-C 有:

MyObject *obj = [[MyObject alloc] init];
SEL function = NSSelectorFromString(@"doSomething");
[obj performSelector: function];

【问题讨论】:

标签: c++ function


【解决方案1】:

您可以导出必要的函数(例如用 __dllexport 标记它们)并使用 GetProcAddress 或 dlsym(取决于您的平台)来获取它们的地址:

void *handle = dlsym(0, RTLD_LOCAL | RTLD_LAZY); FunctionType *fptr = (FunctionType *)dlsym(handle, "doSomething"); fptr(); HANDLE handle = GetCurrentProcess(); FunctionType *fptr = (FunctionType *)GetProcAddress(handle, "doSomething"); fptr();

虽然所有这些都是特定于平台的,但 C++ 中没有标准的方法来执行此操作。

【讨论】:

  • 不能抱怨,这是一个很好的答案。但是我要指出,它非常适合动态调用 C 函数,但不适用于多态 C++ 方法调用。
  • @GrahamPerks:嗯,它会更加特定于平台,比如修改、调整对象指针等,但并非完全不可能。虽然,我怀疑我是否会在生产环境中做这样的事情。
  • 您还可以在声明中使用 extern "C" 标记要引用的函数,以防止在编译过程中名称被破坏。 extern "C" void hello() { std::cout stackoverflow.com/questions/1041866/…
【解决方案2】:

扩展 Konstantin Oznobihin 对问题的回答,您可以在声明中用 extern "C" 标记您引用的 c++ 函数,以防止编译器在编译期间破坏名称。

extern "C" void hello() {
    std::cout << "Hello\n";
}

这将允许您以您最初给它的名称调用您的对象/函数。在这种情况下,它是“你好”。

void *handle = dlsym(0, RTLD_LOCAL | RTLD_LAZY);
FunctionType *fptr = (FunctionType *)dlsym(handle, "hello");
fptr();

extern "C" 在后台做了很多事情,所以这里有一个简短的列表: In C++ source, what is the effect of extern "C"?

【讨论】:

  • 请编辑并将其添加到@KonstantinOznobihin 的答案中。无论如何,谢谢你的好提示。
【解决方案3】:

如果我正确理解了您的问题, 您可以在 C++ 中使用函数指针(或指向成员的指针)。您可以动态决定调用哪个函数(您可能需要相同的原型)并动态调用它。看这个链接

https://isocpp.org/wiki/faq/pointers-to-members

【讨论】:

    【解决方案4】:

    如果您感兴趣的那些函数是相同类型的,您可以创建字符串和函数指针的映射。

    【讨论】:

    • 这意味着我需要更新列表。我正在寻找更自动的。
    • 你可以使用一些程序来生成它(甚至可以在 ctags 结尾加上一点 sed)
    【解决方案5】:

    简单的答案是,你不能。 C++ 不通过名称查找方法。

    【讨论】:

    • 错了,你可以按名称查找DLL函数。
    • @ddriver DLL 不是 C++ 的一部分,DLL 函数也不是 C++ 方法。
    • @Roddy - 您可以将 C++ 编译为 DLL 并通过名称查找获得指向函数的指针。 windows 上的 DLL,linux 上的什么的,你可以通过名称在动态库中查找函数,这是事实。
    • 我的“简单答案”仍然有效。还有更细微的选择。您的 DLL 解决方案是合理的,只是您要动态调用的每个函数都必须是 DLL 的一部分,并且还必须以某种非损坏的形式导出。当函数是类成员时,它会变得更难。不像原始发帖人的 PHP 和 Obj-C 示例那样简单、理想或通用的解决方案。
    猜你喜欢
    • 2021-05-10
    • 1970-01-01
    • 2014-12-21
    • 2015-10-19
    • 2010-11-21
    • 2019-10-07
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    相关资源
    最近更新 更多