用字符串调用同名的函数

时间:2022-09-19 22:17:11
有三个函数
void fun1(XXXXXX);
void fun2(XXXXXX);
void fun3(XXXXXX);
现在我通过处理得到一个字符串,设为:fun2
我如何用API直接调用函数fun2(XXXXXX)呢?

14 个解决方案

#1


调用函数应该取得此函数的地址吧。
c++中函数名称在编译器中要转换的1

#2


可以用函数指针调用啊!

#3


字符串调函数?
这个说法不太好,字符串就是字符串,函数是一个地址

你可以搞一个映射
typedef void (*func)();
typedef map<string , func>   funcmap;

#4


恩,不错

#5







查找map文件






#6


我觉得你这个问题是要求元数据了。似乎需要一套反射库才能很好的解决。

#7







其实也不难啊
一种是在代码里面实现,提供一个总入口,为每个函数提供一个映射
另一种是在编译器和平台工具里面实现,典型的解决方案就是.net和corba了




#8


去年做过一段时间。好象有个叫reflect的C++库(笔记本坏了,信息都没了...),成熟度很高的。大致是用gcc的扩展(gcc-xml??),编译出一个.lib,连进执行文件。就可以使用那套库了。写那套库的好象是做核研究的,严谨性没问题。google上g一下吧。

另外,c++0x原先好象有计划把反射库纳入新标准的。后来似乎没戏了。真想有套非侵入式的C++反射库呀!

#9


我试过用映射的方法,但是参数必须是空的,要不会编译通不过。
我是在.net下开发的VC++.net,是不是给个例子,谢谢。
yutaooo说的我觉得有深度,但是,我不能全部理解,有个类似的例子吗?
如果有的话,我的邮箱是:mrdone@163.com
谢谢

#10


支持雁南飞的说法,我曾经用这种方式实现了快速CASE,从些摆脱了if..else..嵌套耦合的烦恼

#11


这种不就是和脚本实现一样原理吧

#12


str.def:
my_Macro(func1),
my_Macro(func2)

str.h:
#pragma once
void func1();
void func2();
#define my_Macro(a) a
typedef void (*func)();
func fArray[]=
{
    #include "str.def"
};
#undef my_Macro
#define my_Macro(a) #a
char* str[]=
{
    #include "str.def"
};

str.cpp:
#include "str.h"
#include "string.h"

void func1(){}
void func2(){}

void main()
{
char call[]="func1";
int len=sizeof(fArray)/sizeof(fArray[0]);
for(int i=0; i<len; i++)
{
if(strcmp(str[i],call)==0)
{
fArray[i]();
break;
}
}
}

#13


怎么才10分啊,太少了点吧

#14


多谢啦,偶菜菜,以后希望大家多指教

#1


调用函数应该取得此函数的地址吧。
c++中函数名称在编译器中要转换的1

#2


可以用函数指针调用啊!

#3


字符串调函数?
这个说法不太好,字符串就是字符串,函数是一个地址

你可以搞一个映射
typedef void (*func)();
typedef map<string , func>   funcmap;

#4


恩,不错

#5







查找map文件






#6


我觉得你这个问题是要求元数据了。似乎需要一套反射库才能很好的解决。

#7







其实也不难啊
一种是在代码里面实现,提供一个总入口,为每个函数提供一个映射
另一种是在编译器和平台工具里面实现,典型的解决方案就是.net和corba了




#8


去年做过一段时间。好象有个叫reflect的C++库(笔记本坏了,信息都没了...),成熟度很高的。大致是用gcc的扩展(gcc-xml??),编译出一个.lib,连进执行文件。就可以使用那套库了。写那套库的好象是做核研究的,严谨性没问题。google上g一下吧。

另外,c++0x原先好象有计划把反射库纳入新标准的。后来似乎没戏了。真想有套非侵入式的C++反射库呀!

#9


我试过用映射的方法,但是参数必须是空的,要不会编译通不过。
我是在.net下开发的VC++.net,是不是给个例子,谢谢。
yutaooo说的我觉得有深度,但是,我不能全部理解,有个类似的例子吗?
如果有的话,我的邮箱是:mrdone@163.com
谢谢

#10


支持雁南飞的说法,我曾经用这种方式实现了快速CASE,从些摆脱了if..else..嵌套耦合的烦恼

#11


这种不就是和脚本实现一样原理吧

#12


str.def:
my_Macro(func1),
my_Macro(func2)

str.h:
#pragma once
void func1();
void func2();
#define my_Macro(a) a
typedef void (*func)();
func fArray[]=
{
    #include "str.def"
};
#undef my_Macro
#define my_Macro(a) #a
char* str[]=
{
    #include "str.def"
};

str.cpp:
#include "str.h"
#include "string.h"

void func1(){}
void func2(){}

void main()
{
char call[]="func1";
int len=sizeof(fArray)/sizeof(fArray[0]);
for(int i=0; i<len; i++)
{
if(strcmp(str[i],call)==0)
{
fArray[i]();
break;
}
}
}

#13


怎么才10分啊,太少了点吧

#14


多谢啦,偶菜菜,以后希望大家多指教