C 如何使用函数指针从多个文件访问函数

C 如何使用函数指针从多个文件访问函数,c,function-pointers,C,Function Pointers,我有以下结构。我需要检查特定文件是否包含指定的函数。如果是,我需要执行它。我是C的新手,我们怎么处理 struct { char *filename; char *funcname; int (*funcptr)(); } symtab[] = { { "filename1", "one_func", one_func }, { "filename2", "two_func", two_func }, }; 我有以下代码,可以在不考虑文件的情况下使用函数

我有以下结构。我需要检查特定文件是否包含指定的函数。如果是,我需要执行它。我是C的新手,我们怎么处理

struct {
    char *filename;
    char *funcname;
    int (*funcptr)();
} symtab[] = {
    { "filename1", "one_func", one_func },
    { "filename2", "two_func", two_func },
};
我有以下代码,可以在不考虑文件的情况下使用函数指针检查函数:

int one_func(), two_func();
int (*findfunc(char *)) ();

struct {
        char *name;
        int (*funcptr) ();
} symtab[] = {
    { "one_func", one_func },
    { "two_func", two_func },
}; 

int (*findfunc(char *name)) () 
{
    int i;
    for (i = 0; i < sizeof(symtab) / sizeof(symtab[0]); i++) 
        {
        if (strcmp(name, symtab[i].name) == 0)
        return symtab[i].funcptr;
        }
    puts("function not defined");
    return NULL;
}

int one_func()
{
    puts("one");
    return 0;
}

int two_func()
{
    puts("two");
    return 0;
}

int main()
{
    char *funcname = "two_func";
    int (*funcp) () = findfunc(funcname);
    if (funcp != NULL)
    (*funcp) ();

    return 0;
}
int one_func(),two_func();
int(*findfunc(char*))();
结构{
字符*名称;
int(*funcptr)();
}symtab[]={
{“一个函数”,一个函数},
{“two_func”,two_func},
}; 
int(*findfunc(char*name))()
{
int i;
对于(i=0;i
这是一个简单的代码,可以在“助记符”名称的操作中调用自身内部的函数。编译此代码后,将生成一个可执行文件。此可执行文件需要两个输入参数。然后,您可以在终端中以以下方式运行它:

提示$prgname fnName parm

其中:

  • prgname是用于获取可执行文件的名称

  • fnName是插入到函数结构中的“助记符”名称(定义的结构类型的字段
    fnName

  • parm是一个参数(字符串),通过“助记符”名称传递给要调用的函数

代码如下:

 #include <stdio.h>
 #include <string.h>

 /*
  * parm may be used to send data to the function (void
  * because data may be of different kinds)
*/
typedef int tFn(void *parm);

typedef struct symTab {
    const char * fileName;
    const char * fnName;  //fnName shall be every name you want use to call the
                          //function pointed by fn
    tFn * fn;
} tSymTab;

tFn * findFunc(const char * fnName);
int func1(void *);
int func2(void *);

tSymTab symTab[]={
  {"f1.txt","func1",func1},
  {"f2.txt","func2",func2},

  // THIS MUST BE ALWAYS THE LAST LINE
  {"","",NULL}
};

int func1(void *parm)
{
    char * value = (char *)parm;

    printf("I'm in func1 --- the parm value is %s\n",value);

    return 0;
}

int func2(void *parm)
{
    char * value = (char *)parm;

    printf("I'm in func2 --- the parm value is %s\n",value);

    return 0;
}

tFn * findFunc(const char * fnName)
{
    int idx=0;

    while(symTab[idx].fn!=NULL && strcmp(symTab[idx].fnName,fnName))
        idx++;

    return symTab[idx].fn;
}

int main(int argc, char *argv[])
{
    tFn * fn;

    if (argc<3) {
        printf("%s needs two input parameters:\n\n\tThe function name\n\n\ta simple text\n\n",argv[0]);
        return 1;
    }

    fn=findFunc(argv[1]);
    if (fn!=NULL) {
        fn(argv[2]);
    } else {
        printf("The function name %s hasn't a corresponding function in this code!\n",argv[1]);
    }
    return 0;
}
#包括
#包括
/*
*parm可用于向函数发送数据(void
*因为数据可能是不同类型的)
*/
类型定义int tFn(无效*parm);
类型定义结构符号表{
常量字符*文件名;
const char*fnName;//fnName应该是您要用来调用
//fn指出的功能
tFn*fn;
}tSymTab;
tFn*findFunc(常量字符*fnName);
int func1(void*);
int func2(void*);
tSymTab symTab[]={
{“f1.txt”,“func1”,func1},
{“f2.txt”,“func2”,func2},
//这一定是最后一行
{“”,NULL}
};
int func1(void*parm)
{
字符*值=(字符*)parm;
printf(“我在func1中---参数值是%s\n”,value);
返回0;
}
int func2(void*parm)
{
字符*值=(字符*)parm;
printf(“我在func2中---参数值是%s\n”,value);
返回0;
}
tFn*findFunc(常量字符*fnName)
{
int-idx=0;
while(symTab[idx].fn!=NULL&&strcmp(symTab[idx].fnName,fnName))
idx++;
返回symTab[idx].fn;
}
int main(int argc,char*argv[])
{
tFn*fn;

如果(argc)在运行时?在windows上使用共享库
.dll
,在linux上使用
loadlibrary
和朋友,
.so
在linux上使用
dlopen
和朋友。wikipedia上的示例(出于某些原因)看起来像一个。你到底想实现什么?顺便说一句:请正确缩进你的代码。好。玩得开心。查阅
libelf
,看看它提供了什么。当你编写了30%的调试器时,你可能会得到你想要的。在你完成之前,你不可能成功。或者,“在我看来,…”。可能会有这样的情况me magic我不知道这对您是否有用,但我对此有严重的怀疑。请注意,如果任何函数来自共享库,这将增加复杂性。此外,还不清楚您计划使用的文件名是源文件名、对象文件名、共享对象名还是什么。这对我来说并不重要,它可以很好。资源文件名不保证在整个项目中是唯一的-它们不一定是唯一的。也就是说,不同的库可以有包含不同函数集的源文件
utils.c
。这只会增加您尝试执行的操作的复杂性。我强烈建议您重新思考您尝试执行的操作-这就是已经发表的评论的要点。您试图设计的这个自命不凡的系统与工具链提供的功能相抗衡,您想要实现的目标是什么?感谢您的支持。我有一个不同的场景。我的场景是func1驻留在f1.txt和function2 inf2.txt中。