代码之家  ›  专栏  ›  技术社区  ›  drby

制作C++应用程序脚本

  •  8
  • drby  · 技术社区  · 17 年前

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

    void foo(int x, int y)
    

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

    foo(3, 5)
    

    并执行相应的函数。实现这一点最简单的方法是什么?

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

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

    8 回复  |  直到 17 年前
        1
  •  10
  •   Simon Steele    17 年前

    您可以相当简单地嵌入Python,这将为您编写程序脚本提供一种非常强大、可扩展的方法。您可以使用以下方法轻松地(或多或少)将您的C++代码暴露给Python:

    我个人使用boostpython,对此我很满意,但它编译速度慢,调试起来也很困难。

        2
  •  8
  •   Daniel Sloof    17 年前
        3
  •  5
  •   rici    8 年前

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

    使用纯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 只需分离参数,并将它们作为字符串返回向量。当然,这是非常原始的,但我认为如果您只需要调用函数的某种方式是合理的(当然,如果您想要真正的脚本支持,这种方法是不够的)。

        4
  •  3
  •   Nailer    17 年前

    正如丹尼尔所说:

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

    您必须向C++应用程序添加脚本接口。此接口的构建显然取决于您选择的脚本语言。

        5
  •  2
  •   Josh Kelley    17 年前

    欧洲核子研究中心提供 CINT ,一个C/C++解释器,可以嵌入到应用程序中以提供脚本功能。

        6
  •  1
  •   Eduard - Gabriel Munteanu    17 年前

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

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

    然而,在Windows上,这些函数是不可用的(除非周围有一些POSIX环境,比如Cygwin)。但是您可以使用Windows API。

    http://en.wikipedia.org/wiki/Dynamic_loading

        7
  •  1
  •   patrick    17 年前

    Fabio Lombardelli的C++反射(2)通过模板元编程技术为C++提供了完全的重新解释。虽然它完全符合C++标准,但它要求程序员注释类以便使它们具有反射性。

    http://cppreflect.sourceforge.net/

        8
  •  0
  •   kingkongrevenge    17 年前

    您的系统必须“接受字符串”吗?您可以在您的应用程序上公开COM(或CORBA,或任何东西)接口,并让生成这些命令的任何东西直接调用您的应用程序。