C 如何使用函数指针从多个文件访问函数
我有以下结构。我需要检查特定文件是否包含指定的函数。如果是,我需要执行它。我是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 }, }; 我有以下代码,可以在不考虑文件的情况下使用函数
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中。