我想编写一个从 stdin 读取的程序:scanf("%s %s", foo, args);
然后使用参数运行函数 foo(之前在程序中定义): foo(args);
我不知道如何在 C 中执行此操作。我以前可以在 Shell 中轻松做到这一点,但在 C 中似乎很困难
问问题
544 次
2 回答
6
这个问题没有解决方案,它是通用的和跨平台/标准的。
不依赖非标准扩展的非通用解决方案:将名称和函数指针对存储在数组中,执行搜索,通过指针调用函数。例如:
struct namedfunc {
const char *name;
void (*fptr)(void);
} fvect[3] = {
{ "foo", foo_impl },
{ "bar", bar_impl },
{ "baz", baz_impl }
};
char buf[0x100];
fgets(buf, sizeof buf, stdin);
char *p = strchr(buf, '\n');
if (p != NULL)
*p = 0;
for (size_t i = 0; i < sizeof fvect / sizeof fvect[0]; i++) {
if (strcmp(buf, fvect[i].name) == 0) {
fvect[i].fptr();
break;
}
}
依赖于可用动态加载的更通用的解决方案:使用dlopen()
API,如下所示:
void *hndl = dlopen(RTLD_SELF, RTLD_LAZY); // try NULL if RTLD_SELF doesn't work
void (*fptr)(void) = dlsym(hndl, buf);
if (fptr != NULL)
fptr();
dlclose(hndl);
于 2013-09-30T16:07:17.440 回答
2
另一个难以调试、高度脆弱的解决方案将涉及使用调试符号(或映射文件)进行编译、解析它们并动态调用函数。太疯狂了。
不过,合理的是,您真的希望程序中的每个函数都可以以这种方式调用吗?包括main
? 可能不是。那么,确定一组应该以这种方式调用的函数,并构建一个包含函数名称和函数指针的结构数组。当输入时出现函数名称时,扫描该函数的数组,找到函数指针并调用。如果它们有不同的原型,请添加另一个成员来描述函数期望的参数类型。(编辑:上面的答案建议相同并提供详细信息)
于 2013-09-30T16:12:22.607 回答