Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何从存储在char*指针中的name调用c函数?_C++_C_Linux - Fatal编程技术网

C++ 如何从存储在char*指针中的name调用c函数?

C++ 如何从存储在char*指针中的name调用c函数?,c++,c,linux,C++,C,Linux,我希望通过函数名动态调用函数,例如,假设函数和字符串如下: void do_fork() { printf ("Fork called.\n"); } char *pFunc = "do_fork"; 现在我需要通过*pFunc调用do_fork()。那有可能吗 欢迎使用C/C++代码,非常感谢 不完全确定它是否是您要找的,但您可以轻松使用dlopen和dlsym void *dlsym(void *restrict handle, const char *restrict name

我希望通过函数名动态调用函数,例如,假设函数和字符串如下:

void do_fork()
{
   printf ("Fork called.\n");

}

char *pFunc = "do_fork";
现在我需要通过
*pFunc
调用
do_fork()
。那有可能吗


欢迎使用C/C++代码,非常感谢

不完全确定它是否是您要找的,但您可以轻松使用
dlopen
dlsym

void *dlsym(void *restrict handle, const char *restrict name);
dlsym()函数应获得 符号中定义的符号的地址 通过 dlopen()调用。句柄参数是 从对的调用返回的值 dlopen()(此后没有 通过调用dlclose()释放),以及
名称
是符号的名称作为 字符串。


这是说,C通常不这样做,所以你可能不需要它。

< P> C和C++都没有足够的反射来完成这个,所以你必须实现你自己的方案。 在C++中,或多或少的规范方法是使用字符串映射来操作指针。大概是这样的:

typedef void (*func_t)();
typedef std::map<std::string,func_t> func_map_t;

// fill the map
func_map_t func_map;
func_map["do_fork"] = &do_fork;
func_map["frgl"] = &frgl;

// search a function in the map
func_map_t::const_iterator it = func_map.find("do_fork");
if( it == func_map.end() ) throw "You need error handling here!"
(*it->second)();
typedef void(*func_t)();
typedef标准::映射函数映射;
//填图
函数映射;
func_map[“do_fork”]=&do_fork;
函数映射[“frgl”]=&frgl;
//在地图中搜索函数
func_map_t::const_迭代器it=func_map.find(“do_fork”);
如果(it==func_map.end())抛出“这里需要错误处理!”
(*it->second)();

当然,这仅限于具有完全相同签名的函数。但是,通过使用
std::function
std::bind
而不是普通的函数指针,可以在一定程度上解除此限制(包括合理兼容的签名)

这确实是可能的,但并不完全容易

您需要做的是编译二进制文件以进行动态绑定;然后根据@cnicutar的回答,使用dlsym获取函数

当然,还有一些警告;但是,如果所讨论的函数位于一个动态链接库中,其路径保证在运行时是已知的(插件或扩展模块将与此匹配),那么这是一种相当安全的方法


活动可执行文件OTOH中的dlsym ing函数有问题。

如果必须使用该函数的名称来完成,并且您不想按照cnicutar的方式进行,则可以使用以下方法:


在自己的*.exe文件中编译每个函数。使用系统(路径到函数可执行文件/函数名称)调用可执行文件。

如果您知道需要调用的所有函数,并且这些函数放在一个程序中,则可以使用以下方法:

void do_fork()
{
    printf ("Fork called.\n");
}

void callFunc(char *funcName)
{
    if (strcmp(funcName, "do_fork") == 0) do_fork();
}

int main()
{
    char *pFunc = "do_fork";
    callFunc(pFunc);
    return 0;
}

通过使用GetProcAddress(Windows)和dlsym(UNIX)等黑客技术,这是可能的,但几乎肯定是个坏主意。改为使用函数指针。@cdarke:这假设在他的用例中甚至可以使用函数指针。dlsym(和朋友)最适合这种情况;因为他们实际上做了他要求的事情;而不是需要一个完全不同的情况。