2017-06-01 106 views
0

我的结构如下。我需要检查一个特定的文件是否包含指定的功能。如果是,我需要执行它。我是新来下我们如何处理这个如何使用函数指针从多个文件中访问函数

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; 
} 
+0

在运行时?在windows上使用'.dll'共享库 - >在linux上使用'loadlibrary'和好友,'.so' - >使用'dlopen'和好友。维基百科上的示例(出于某种原因)https://en.wikipedia.org/wiki/Dynamic_loading – Lanting

+2

看起来像[XY问题](http://xyproblem.info/)。你正在努力实现什么? –

+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; 
} 
+0

谢谢你的支持。我有一个不同的scenaroi.My场景是func1驻留在f1.txt和function2 inf2.txt中。 –