0

我想编写一个从 stdin 读取的程序:scanf("%s %s", foo, args);然后使用参数运行函数 foo(之前在程序中定义): foo(args);我不知道如何在 C 中执行此操作。我以前可以在 Shell 中轻松做到这一点,但在 C 中似乎很困难

4

2 回答 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 回答