我想写一个从stdin:scanf("%s %s", foo, args);读取数据的程序,然后用参数:foo(args);运行函数foo(以前在程序中定义过),我不知道如何在C中实现这一点。我以前在Shell中很容易做到这一点,但在C语言中似乎很难做到

最佳答案

这个问题没有一个统一的、跨平台/标准的解决方案。
不依赖非标准扩展的非通用解决方案:在数组中存储名称和函数指针对、执行搜索、逐指针调用函数。例如:

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);

关于c - 如何从STDIN读取C函数并在程序中运行它?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19098778/

10-13 21:59