使C ++应用程序可编写脚本

时间:2009-01-28 12:17:51

标签: c++ string scripting

我的程序中有几个函数如下所示:

void foo(int x, int y)

现在我希望我的程序采用如下字符串:

foo(3, 5)

执行相应的功能。实现这一目标最直接的方法是什么?

当我直截了当地说,我的意思是合理的可扩展性和优雅,但编码不应该花太长时间。

修改

虽然使用真正的脚本语言当然可以解决我的问题,但我仍然想知道是否有一种快速的方法可以在纯C ++中实现它。

8 个答案:

答案 0 :(得分:10)

您可以非常简单地嵌入Python,这将为您提供一种非常强大,可扩展的脚本来编写程序。您可以使用以下内容轻松(或多或少)将您的C ++代码公开给Python:

我个人使用Boost Python,我很满意,但编译速度慢,难以调试。

答案 1 :(得分:8)

您可以查看Lua

答案 2 :(得分:5)

我也会选择脚本语言答案。

使用纯C ++,我可能会使用一个解析器生成器,它将获得令牌和语法规则,并将给我一个完全可以解析给定函数调用语言的C代码,并为我提供了一个语法树呼叫。 flex可用于标记输入,bison可用于解析标记并将其转换为语法树。作为该方法的替代,Boost Spirit也可用于解析函数调用语言。我从未使用过任何这些工具,但已经使用过它们的程序,因此我有点知道如果我必须解决这个问题我会用什么。

对于非常简单的情况,您可以将语法更改为:

func_name arg1, arg2

然后你可以使用:

std::istringstream str(line);
std::string fun_name; str >> fun_name;
map[fun_name](tokenize_args(str));

地图将是

std::map<std::string, boost::function<void(std::vector<std::string>)> > map;

将在程序开头填充功能。 tokenize_args只会将参数分开,并将它们的向量作为字符串返回。当然,这是非常原始的,但我认为如果你想要的只是一种调用函数的方法是合理的(当然,如果你想要真正的脚本支持,这种方法是不够的)。

答案 3 :(得分:3)

丹尼尔说:

像Lua和Python这样的脚本语言将是用于将c ++库绑定在一起的最常用的脚本语言。

您必须为c ++应用程序添加脚本界面。这个界面的构建显然取决于你选择的脚本语言。

答案 4 :(得分:2)

CERN提供CINT,这是一个C / C ++解释器,可以嵌入到您的应用程序中以提供脚本功能。

答案 5 :(得分:1)

如果您只希望按文字名称调用函数,则可以使用特定于链接器的函数。

在符合POSIX的操作系统(如Linux)上,您可以使用dlopen()和dlsym()。您只需解析输入字符串并找出函数名称和参数。然后,您可以要求链接器使用dlsym()按名称查找函数。

在Windows上,这些功能不可用(除非有一些POSIX环境,如Cygwin)。但您可以使用Windows API。

您可以在此处查看有关这些内容的详细信息:http://en.wikipedia.org/wiki/Dynamic_loading

答案 6 :(得分:1)

Fabio Lombardelli的C ++ Reflection [2]通过模板元编程技术为C ++提供了完整的反思。虽然它完全符合C ++标准,但它要求程序员注释类以便反思

http://cppreflect.sourceforge.net/

否则你想要一个函数指针哈希表我认为

答案 7 :(得分:0)

您的系统是否必须“收取字符串”?您可以在应用程序上公开COM(或CORBA或其他)接口,并将生成这些命令的任何内容直接调用到您的应用程序中。