免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2382 | 回复: 8
打印 上一主题 下一主题

[函数] 请教一个函数调用问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-03 14:00 |只看该作者 |倒序浏览
库里有一个函数,怎么通过传递一个字符串来实现调用

例如

a.so里包括了:aaa函数

void call("aaa" )
{
怎么利用“aaa”字符串实现调用aaa函数

而不是  aaa(); 这么调用  

}

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
2 [报告]
发表于 2007-09-03 14:07 |只看该作者
if("aaa"
{
    aaa()
}
:wink:

论坛徽章:
0
3 [报告]
发表于 2007-09-03 14:12 |只看该作者
好像system

void call()
{
system("aaa");//可以调一个名为aaa的程序,现在怎么调一个函数
}

论坛徽章:
0
4 [报告]
发表于 2007-09-03 14:48 |只看该作者
原帖由 yecheng_110 于 2007-9-3 14:07 发表
if("aaa"
{
    aaa()
}
:wink:


论坛徽章:
0
5 [报告]
发表于 2007-09-03 14:56 |只看该作者
RTTL ,C滴,大大滴没有!

论坛徽章:
0
6 [报告]
发表于 2007-09-03 16:12 |只看该作者
C++写了一个例子 看对你有没帮助
#include<stdio.h>
#include<stdlib.h>
#include<map>
#include<string>
using namespace std;

extern void fun_1();
extern void fun_2();
void fun_1()
{
&nbsp;&nbsp;&nbsp;&nbsp;printf("fun_1....\n");
}

void fun_2()
{
&nbsp;&nbsp;&nbsp;&nbsp;printf("fun_2....\n");
}



/*函数指针结构体*/
typedef struct STTEST
{
&nbsp;&nbsp;&nbsp;&nbsp;void (*fun)();
}stTest;

/*CFunManager 函数管理类*/
class CFunManager
{
&nbsp;&nbsp;&nbsp;&nbsp;public:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CFunManager();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~CFunManager();
&nbsp;&nbsp;&nbsp;&nbsp;protected:
&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;private:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map<const char *,stTest> funMap;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stTest st_test;
&nbsp;&nbsp;&nbsp;&nbsp;public:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void Call( const char *pcStr );
};

CFunManager::CFunManager()
{
&nbsp;&nbsp;&nbsp;&nbsp;st_test.fun = fun_1;
&nbsp;&nbsp;&nbsp;&nbsp;funMap.insert(map<const char *,stTest>::value_type("fun_1",st_test));/*注册函数fun_1*/
&nbsp;&nbsp;&nbsp;&nbsp;st_test.fun = fun_2;
&nbsp;&nbsp;&nbsp;&nbsp;funMap.insert(map<const char *,stTest>::value_type("fun_2",st_test));&nbsp;&nbsp;&nbsp;&nbsp;/*注册函数fun_2*/
}

CFunManager::~CFunManager()
{
&nbsp;&nbsp;&nbsp;&nbsp;
}

void CFunManager::Call( const char *pcStr )
{
&nbsp;&nbsp;&nbsp;&nbsp;stTest *st_test;
&nbsp;&nbsp;&nbsp;&nbsp;st_test = &funMap[pcStr];
&nbsp;&nbsp;&nbsp;&nbsp;if( st_test->fun )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st_test->fun();
}

int main(void)
{
&nbsp;&nbsp;&nbsp;&nbsp;CFunManager *fm = new CFunManager();
&nbsp;&nbsp;&nbsp;&nbsp;fm -> Call( "fun_1" );
&nbsp;&nbsp;&nbsp;&nbsp;fm -> Call( "fun_2" );
&nbsp;&nbsp;&nbsp;&nbsp;delete fm;
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

论坛徽章:
0
7 [报告]
发表于 2007-09-03 19:18 |只看该作者
只能typedef

论坛徽章:
0
8 [报告]
发表于 2007-09-03 22:29 |只看该作者
原帖由 wgfbj2002 于 2007-9-3 14:00 发表
库里有一个函数,怎么通过传递一个字符串来实现调用

例如

a.so里包括了:aaa函数

void call("aaa" )
{
怎么利用“aaa”字符串实现调用aaa函数

而不是  aaa(); 这么调用  

}

lz的意思是把这些函数封装一次通过名字调用吗?如果是建一张表就可以了,例如

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct
  4. {
  5.     char name[100];
  6.     unsigned long func;
  7. }map_t;

  8. static void aaa()
  9. {
  10.     printf("aaa\n");
  11. }

  12. static void bbb()
  13. {
  14.     printf("bbb\n");
  15. }

  16. map_t tbl[10] =
  17. {
  18.     "aaa", (unsigned long)aaa,
  19.     "bbb", (unsigned long)bbb,
  20. };

  21. static void call(char *name)
  22. {
  23.     int i;
  24.     for ( i=0; i<sizeof(tbl)/sizeof(tbl[0]); i ++ )
  25.         if ( !strcmp(name, tbl[i].name) )
  26.         {
  27.             ((void (*)())tbl[i].func)();
  28.             break;
  29.         }
  30. }

  31. int main()
  32. {
  33.     call("aaa");
  34.     call("bbb");

  35.     return 0;
  36. }                              
复制代码

这里把aaa,bbb换成你要的库函数名就可以了。
这样对于函数原型都相同的的函数好用,如果各个函数原型不同,调用的时候就要做不同的类型转换,不很方便。
另外你可以把数组换成hash table,用名字作为哈希值,这样省掉了遍历

论坛徽章:
0
9 [报告]
发表于 2007-09-06 14:58 |只看该作者
给一个我写的应用:

#include <dlfcn.h>
shobj_path:动态调用库文件名称,带路径
func_name:函数名称,字符串的,这里可以是你的aaa,或者其他什么都可以,只要是在shobj_path里面定义的。
para:参数列表,可以传入或返回数值,调用之前需要实例化。
int DLCall(char *shobj_path, char *func_name, char **param)
{
    void *shobj_handle, (*func_ptr)();
    char call_path[1024];

    if (shobj_path[0] == '/')
       strcpy(call_path, shobj_path);
    else
       {
       call_path[0] = 0;
       getwd(call_path);
       strcat(call_path, "/");
       strcat(call_path, shobj_path);
       }

    shobj_handle = (char*)dlopen(call_path, RTLD_LAZY);
    call_errmsg=(char *)dlerror();
    if (call_errmsg != NULL)
       {
        return 0;
       }

    func_ptr = (void (*)())dlsym(shobj_handle, func_name);
    call_errmsg=(char *)dlerror();
    if (call_errmsg != NULL)
       {
        dlclose(shobj_handle);
        return -1;
       }
                       
    if (param == NULL)
       (*func_ptr)();
    else
       (*func_ptr)(param);
      
    dlclose( shobj_handle );

    return 1;
}

[ 本帖最后由 jlogzl 于 2007-9-6 15:03 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP