如何在c ++中动态调用函数

时间:2012-01-19 05:27:04

标签: c++ function

除了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];

5 个答案:

答案 0 :(得分:8)

您可以导出必要的功能(例如通过使用__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 ++中没有标准的方法来执行此操作。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

简单的答案是,你做不到。 C ++不会按名称查找方法。

答案 4 :(得分: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();

外部有一些东西“C”在引擎盖下,所以这里有一个简短的列表: In C++ source, what is the effect of extern "C"?