关于传函数名的问题

loulou_ff 2008-05-24 04:21:59
就是想在执行的时候把函数名传如,而不是在程序中选择!!!


主函数类似于这样
main(int argc,char *argv[])
{
................
char fun_name[100];
*fun_name=argv[1];

调用(fun_name函数)
...............
}

运行的时候就是想这样 ./main fun1
...全文
172 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
matrixdwy 2008-05-24
  • 打赏
  • 举报
回复
用vector存放函数指针可行不?
WingForce 2008-05-24
  • 打赏
  • 举报
回复
呃。。。最后的main函数中应该调用一下create_func_map
WingForce 2008-05-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 loulou_ff 的回复:]
我不想用strcmp比较函数
因为函数有几十个或更多

WingForce 的方法应该可行,我去测试............

还有我是在linux 下运行

我最晚明天结分

[/Quote]

很遗憾,即使使用我那个方式,本质上还是进行strcmp,无论什么办法,这个步骤都无法避开

如果只是不想显式的使用strcmp,还可以用下面的办法


void func_1(void)
{
printf("func_1");
}

void func_2(void)
{
printf("func_2");
}

void func_3void)
{
printf("func_3");
}

typedef void (*fun)(void);

map<string, fun> func_map;

map<string, fun> create_func_map()
{
#define insert_func_entry(map, func) map.insert(pair<string, fun>(string(#func), func))

insert_func_entry(func_map, func_1);
insert_func_entry(func_map, func_2);
insert_func_entry(func_map, func_3);
// ...

return map;
}

void call_by_string(const string& fun_name)
{
map<string, fun>::iterator find_result= func_map.find(fun_name);
if (find_result != func_map.end())
((*find_result).second)();
}

int _tmain(int argc, _TCHAR* argv[])
{
call_by_string(string(argv[1]));
system("PAUSE");
return 0;
}

bo.cui 2008-05-24
  • 打赏
  • 举报
回复
不管怎样,都要依赖:"在程序中选择"
bo.cui 2008-05-24
  • 打赏
  • 举报
回复
....

我实在是想不出来有什么办法不在程序中选择.

主函数的参数只是字符串而已.无论如何你也不能把他转换成函数入口地址(除非在程序中选择)

从原理上讲也不现实.
程序名因该是在程序编译时候被转换成了一个入口地址(这是已经失去了函数名).但是传递给主函数的字符串是在运行时确定的(这时候已经没有哪些函数名了).

你看看编译原理就明白了.
loulou_ff 2008-05-24
  • 打赏
  • 举报
回复
我不想用strcmp比较函数
因为函数有几十个或更多

WingForce 的方法应该可行,我去测试............

还有我是在linux 下运行

我最晚明天结分
WingForce 2008-05-24
  • 打赏
  • 举报
回复
用strcmp比较函数名就行了

如果函数签名都一样,还可以用下面这个无聊的办法:


#include <Windows.h>
#include <process.h>

extern "C" {
__declspec(dllexport) void func_1(void)
{
printf("func_1");
}

__declspec(dllexport) void func_2(void)
{
printf("func_2");
}

};

int _tmain(int argc, _TCHAR* argv[])
{
typedef void (*fun)(void);
fun pfun = NULL;

pfun = (fun)GetProcAddress(NULL, argv[1]);

if (pfun)
{
pfun();
}
else
{
printf("no such function!\n");
}

system("PAUSE");
return 0;
}
matrixdwy 2008-05-24
  • 打赏
  • 举报
回复
用strcpy
chlaws 2008-05-24
  • 打赏
  • 举报
回复
想法是不错
但是,你在控制台输入的argv[i] 这是判定为字符串的.而不是你所期望的函数名.
再之 char fun_name[100]这是数组,数组和指针有着本质的区别,数组是有固定的地址,地址不能改变的
而且赋值要用拷贝 。只有指针才能随意的指向任意的地址
lixun_21 2008-05-24
  • 打赏
  • 举报
回复
上面 打错了个字符
如果你的程序名称是 text.exe
运行是 输入 text.exe fun1
部分代码:
void main(int argc,char *argv[])
{
...
if(!strcmp(argv[1],"fun1"))
fun1();
else if(!strcmp(argv[1],"fun2"))
fun2();
...
}
lixun_21 2008-05-24
  • 打赏
  • 举报
回复

如果你的程序名称是 text.exe
运行是 输入 text.exe fun1
部分代码:
void main(int argc,char *argv[])
{
...
if(!strcmp(argc[1],"fun1"))
fun1();
else if(!strcmp(argc[1],"fun2"))
fun2();
...
}
loulou_ff 2008-05-24
  • 打赏
  • 举报
回复
分数不够可以在开贴加分

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧