免费注册 查看新帖 |

Chinaunix

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

[C] 探讨C语言函数调用的一个问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-11 21:18 |只看该作者 |倒序浏览
探讨一个问题:
一个程序中需要执行一个函数,有很多个函数被编译进了一个静态库文件,但是  主程序并不知道需要执行的函数名是什么  需要去读取一个文本文件去获得函数名   这个如何实现  最好

论坛徽章:
0
2 [报告]
发表于 2005-10-11 21:50 |只看该作者

探讨C语言函数调用的一个问题

函数指针

论坛徽章:
0
3 [报告]
发表于 2005-10-11 21:56 |只看该作者

探讨C语言函数调用的一个问题

把你的函数放到动态连接库里面,然后在执行时动态加载,由文本文件读入要调用的函数名.当然,你必须了解函数的原型并给函数提供正确的参数,就像下面调用cos函数一样.

  1. #include <stdio.h>;
  2. #include <dlfcn.h>;

  3. int main(int argc, char **argv) {
  4.     void *handle;
  5.     double (*cosine)(double);
  6.     char *error;

  7.     handle = dlopen ("libm.so", RTLD_LAZY);
  8.     if (!handle) {
  9.         fprintf (stderr, "%s\n", dlerror());
  10.         exit(1);
  11.     }

  12.     dlerror();    /* Clear any existing error */
  13.     *(void **) (&cosine) = dlsym(handle, "cos");
  14.     if ((error = dlerror()) != NULL)  {
  15.         fprintf (stderr, "%s\n", error);
  16.         exit(1);
  17.     }

  18.     printf ("%f\n", (*cosine)(2.0));
  19.     dlclose(handle);
  20.     return 0;
  21. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2005-10-11 22:20 |只看该作者

探讨C语言函数调用的一个问题

原帖由 "geba168" 发表:
探讨一个问题:
一个程序中需要执行一个函数,有很多个函数被编译进了可执行文件,但是  主程序并不知道需要执行的函数名是什么  需要去读取一个文本文件去获得函数名   这个如何实现  最好



函数名集合不用写文件,可定义一个表(如结构数组)
将函数名写进这个表.

主程序进来后可以根据动作查找这张表,取得函数名,赋给主程序的函数指针.
这是常用的多路转接问题.

论坛徽章:
0
5 [报告]
发表于 2005-10-11 22:27 |只看该作者

探讨C语言函数调用的一个问题

原帖由 "geba168" 发表:
探讨一个问题:
一个程序中需要执行一个函数,有很多个函数被编译进了可执行文件,但是  主程序并不知道需要执行的函数名是什么  需要去读取一个文本文件去获得函数名   这个如何实现  最好



函数被编译成为一个一个的库文件.

导出库文件的符号名,就可以知道,库里面有什么函数

程序链接到库函数不就行了吗?

论坛徽章:
0
6 [报告]
发表于 2005-10-12 11:52 |只看该作者

探讨C语言函数调用的一个问题

多谢   CHINAUNIX好人真多   这种问题基本上只有在这个论坛才有人回答

论坛徽章:
0
7 [报告]
发表于 2005-10-12 11:56 |只看该作者

探讨C语言函数调用的一个问题

麻烦再问一下    如果我的函数库编译的是  静态的   那么用什么函数去调用呢,应该就不是dlsym()了啊?

论坛徽章:
0
8 [报告]
发表于 2005-10-12 15:03 |只看该作者

探讨C语言函数调用的一个问题

那只有用结构数组来对应了
检索结构数组的键值就是你从文本文件里取出来的函数名。结构可以参照如下定义:

struct func_tab_tag
{
   char        *funcnam[16];  /* 函数名称 */
   void *     (*func)(void *); /* 函数名称对应的函数指针地址    */
   /* other define   */
   /* .......  */
};

论坛徽章:
0
9 [报告]
发表于 2005-10-12 15:19 |只看该作者

探讨C语言函数调用的一个问题

原帖由 "wjywhl" 发表:
函数名称 */
   void *     (*func)(void *); /* 函数名称对应的函数指针地址    */
   /* other define   */
   /* .......  */
};



有什么好方法,从库文件分解出函数名,地址?

论坛徽章:
0
10 [报告]
发表于 2005-10-12 15:22 |只看该作者

探讨C语言函数调用的一个问题

原帖由 "mik" 发表:



有什么好方法,从库文件分解出函数名,地址?


dlsym
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP