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

时间:2017-06-01 08:22:46

标签: c function-pointers

我确实有以下结构。我需要检查特定文件是否包含指定的函数。如果是,我需要执行它。我是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;
}

1 个答案:

答案 0 :(得分:0)

这是一个简单的代码,可以在“助记符”名称的操作中调用自身内部的函数。编译此代码后,将生成可执行文件。此可执行文件需要两个输入参数然后你可以在你的终端上运行它:

提示$ prgname fnName parm

其中:

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

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

  • 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;
}