我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

本页主题: c语言怎样通过字符串数组(内容为函数名)调用函数 隐藏签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

devin



性别: 帅哥 状态: 该用户目前不在线
等级: 品行端正
发贴: 272
威望: 0
浮云: 493
在线等级:
注册时间: 2010-02-08
最后登陆: 2016-04-28

5come5帮你背单词 [ shame /eim/ n. 耻辱,羞愧,可耻的人或物;vt. 使羞愧 ]


c语言怎样通过字符串数组(内容为函数名)调用函数

熟悉c的帮忙看下,实现如下功能:

void goto_test(){
    printf("this is go to test\n");
}

char a[] = "goto_test";

怎样通过类似java反射机制来通过读取a的内容来执行函数?
execute_by_name(a);  // ??



哀莫大于心死,哀更莫大于心不死!
--云哥哥
顶端 Posted: 2010-05-18 16:39 | [楼 主]
枫姐姐



贝尔诺勋章
性别: 美女 状态: 该用户目前不在线
头衔: 御姐控
等级: 人见人爱
发贴: 3381
威望: 0
浮云: 31792
在线等级:
注册时间: 2009-08-17
最后登陆: 2023-11-19

5come5帮你背单词 [ artificial /a:ti'fiəl/ a. 文章,论文,物件,物品,条款,项目,冠词 ]


java反射机制是什么东东?
松岛かえで

顶端 Posted: 2010-05-18 22:21 | [1 楼]
枫姐姐



贝尔诺勋章
性别: 美女 状态: 该用户目前不在线
头衔: 御姐控
等级: 人见人爱
发贴: 3381
威望: 0
浮云: 31792
在线等级:
注册时间: 2009-08-17
最后登陆: 2023-11-19

5come5帮你背单词 [ change /teind3/ vt. 改变,更改交换,况换;vi. 改变,变更;n. 变化交换,零钱 ]


俺知道linux下system函数可以实现类似功能
松岛かえで

顶端 Posted: 2010-05-18 22:31 | [2 楼]
sparkhunter



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
家族: 吃呆一族
发贴: 2194
威望: 0
浮云: 1671
在线等级:
注册时间: 2006-02-21
最后登陆: 2021-05-28

5come5帮你背单词 [ constant /'konstənt/ a. 固定不变的,经常发生的忠实的;n. 不变的事物,常数,恒量,系数 ]


你说的应该是动态语言的功能。
C里只能用函数指针或者宏来模仿。
寂寞浪子,风歌如雪。
顶端 Posted: 2010-05-18 23:28 | [3 楼]
devin



性别: 帅哥 状态: 该用户目前不在线
等级: 品行端正
发贴: 272
威望: 0
浮云: 493
在线等级:
注册时间: 2010-02-08
最后登陆: 2016-04-28

5come5帮你背单词 [ skinny /skini/ a. 皮包骨的,瘦的 ]


反射是代码在运行时动态装配,就如这个帖子我想实现的功能,详细可以看这个帖子
http://blog.csdn.net/wmh4242424cs/archive/2007/09/23/1796823.aspx

开发平台是mtk,不是linux,貌似mtk的平台不支持。

请问sparkhunter用指针怎么实现呢
宏试了一下,下面这样直接用字符倒是可以
#define INVOKE_BY_NAME(str) str##()
void goto_test(){
    printf("this is go to test\n");
}

void main(){
    char a[] = "goto_test";
    INVOKE_BY_NAME(goto_test); // 直接用字符
    getchar();
}

但是下面这样就不行,把a直接当成一个字符了
#define INVOKE_BY_NAME(str) str##()
void goto_test(){
    printf("this is go to test\n");
}

void main(){
    char a[] = "goto_test";
    INVOKE_BY_NAME(a); // 用字符数组
    getchar();
}
不知道有没有好的办法解决


[ 此帖被devin在2010-05-19 09:40重新编辑 ]
哀莫大于心死,哀更莫大于心不死!
--云哥哥
顶端 Posted: 2010-05-19 09:31 | [4 楼]
sparkhunter



性别: 帅哥 状态: 该用户目前不在线
等级: 人见人爱
家族: 吃呆一族
发贴: 2194
威望: 0
浮云: 1671
在线等级:
注册时间: 2006-02-21
最后登陆: 2021-05-28

5come5帮你背单词 [ head /hed/ n. 头,头部,前部,顶端;vt. 领导,首脑,领导,主管,居…之首;vi. 朝…方向前进 ]


兄台在MTK吗?呵呵。

C本身不具备动态属性,你的最后一个想法应该没办法完美支持。
貌似我在哪里看到过一个依赖编译器的方法,类似hack。想不起来了……

拙见是用符号表+函数指针模拟,再用一个接口来负责符号与代码的映射。
这样的做法很常见,比如动态链接库,dll里保存着符号表和代码,由加载函数实现映射。
或者system()函数,参数传递给shell,shell做的映射。
typedef void (* function)(void);

typedef struct _LIB{
    char * name;
    function exec;
}LIB;

static LIB lib[100]; // build your own lib.

void invoke(char * name)
{
    if(name == lib.name)
    lib.exec();
}

再利用宏做一些trick,让代码看起来更像reflection风格……
本帖最近评分记录:
  • 浮云:15(震月) 技术仔要顶
  • 寂寞浪子,风歌如雪。
    顶端 Posted: 2010-05-19 22:01 | [5 楼]
    hzan





    性别: 保密 状态: 该用户目前不在线
    等级: 品行端正
    发贴: 170
    威望: 0
    浮云: 1132
    在线等级:
    注册时间: 2006-09-23
    最后登陆: 2011-04-23

    5come5帮你背单词 [ liability /laiə'biliti/ n. 责任,义务,(pl.)债务,倾向 ]


    楼主如果想要C实现一个函数execute_by_name();  的话恐怕不行,execute_by_name(a);运行后,a形参和返回值怎么处理?
    一般的解决方法是楼上所说的方法,具体的方法可以参考u-boot的控制台的代码,可以用一个宏和GCC编译器的链接命令来实现execute_by_name();  但是被调用函数的返回值无法传递出来。
    顶端 Posted: 2010-05-19 23:41 | [6 楼]
    DebugAnyway



    性别: 帅哥 状态: 该用户目前不在线
    头衔: 江湖人称小徐锦江
    等级: 荣誉会员
    发贴: 1872
    威望: 1
    浮云: 499
    在线等级:
    注册时间: 2004-04-07
    最后登陆: 2018-03-16

    5come5帮你背单词 [ unload /Λn'ləud/ vt. 卸(货),解除(负担等) ]


    其实,用标准C的__stdcall的dll动态调用方式就是这样的啊!
    第一步,在文档上获知函数的参数以及返回情况
    第二步,用LoadLibrary
    第三步,用GetProcAddress

    以上俩函数详见MSDN
    2013年再次从成电毕业,2015年脱下军装,回到成电身边,当兵十年,母猪当貂蝉。
    顶端 Posted: 2010-05-26 21:14 | [7 楼]
    devin



    性别: 帅哥 状态: 该用户目前不在线
    等级: 品行端正
    发贴: 272
    威望: 0
    浮云: 493
    在线等级:
    注册时间: 2010-02-08
    最后登陆: 2016-04-28

    5come5帮你背单词 [ spice /spais/ n. 香料,调味品;vt. 加调料 ]


    谢谢各位,先暂时写死了,这个就结帖了
    哀莫大于心死,哀更莫大于心不死!
    --云哥哥
    顶端 Posted: 2010-05-28 09:18 | [8 楼]
    我来我网·5come5 Forum » 程序员之家

    Total 0.008639(s) query 5, Time now is:11-24 06:12, Gzip enabled
    Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号