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

重构代码位远离本机C++的选项?

  •  2
  • Joe  · 技术社区  · 16 年前

    因此,在谈论性能时,一个常见的评论是,用任何语言编写代码都能最快地完成任务。如果在特定区域中的性能是一个问题,那么在C/C++中改写这些位。

    但是,如果你从一个本地C++应用程序开始呢?如果您想用诸如python、ruby、c_之类的语言编写简单的位或重构旧的位,您有什么选择?请记住,必须在本机和其他方之间传输数据。能够简单地调用一个用“更容易”的语言编写的函数,而将C++类作为数据,则是很漂亮的。

    我们有一个硬壳的win32应用程序,如果我们能用C语言或其他语言编写新的代码或重构旧的代码,它将大大受益。它很少需要C++的复杂性,而处理小的惰性位正拖累编程过程。

    5 回复  |  直到 16 年前
        1
  •  2
  •   Community CDub    8 年前

    AS Aaron Fischer 建议,尝试重新编译C++应用程序,打开/CLR选项,然后开始利用.NET平台。

    CLI/C++是很容易拾取的,如果你已经知道C和C++,它提供了.NET世界和本地C++之间的桥梁。

    如果您当前的C++代码不能用CL/CLR打开,那么我建议您将应用程序构建为静态LIB(没有/CLR启用),然后让您的主()在调用您的遗留应用程序入口点的CLI/C++项目中。这样,您至少可以开始利用.NET实现新功能。

    对于已经被“移植”到.NETCLI/C++的“遗留”C/C++应用程序的例子,请检查.NET端口的 Quake 2 Quake 3: Arena .

        2
  •  1
  •   coppro    16 年前

    嗯,这真的取决于语言。Python接口,例如,最容易用PosithPython来完成,许多其他语言将要求你像C一样使用C语言库来连接它们,并将回调声明为“C”(不幸的是,通常不能使用其他语言中的C++类定义)。

    但我也会问你打算使用它作为C++是一种复杂的语言,但一旦你熟悉它,它是非常强大的,并不是很难编码比其他语言。我唯一能想到的非常好的例外是,如果你计划使用一个只存在于一种语言中的强大的库,并且没有一个象样的C++替代品(图形库可能是最好的例子,因为你必须非常熟悉它们才能有效地使用它们)。

    同样值得指出的是,如果将C++代码与另一种语言进行接口,那么就失去了该语言所授予的跨平台兼容性。

        3
  •  1
  •   Douglas Mayle    16 年前

    如果您想在C++和Python之间工作, Boost Python 就是你要找的。您可以为cython手工编写c-python绑定,但这在许多方面限制了您编写代码的方式。这是最简单的方法,如下面的一些片段所示 this tutorial :

    执行Hello World的简单函数:

    char const* greet()
    {
       return "hello, world";
    }
    

    将其公开给python所需的boost python代码:

    #include <boost/python.hpp>
    
    BOOST_PYTHON_MODULE(hello_ext)
    {
        using namespace boost::python;
        def("greet", greet);
    }
    

    如何从python使用此代码:

    >>> import hello_ext
    >>> print hello.greet()
    hello, world
    

    相反的方向有点困难,因为Python不编译为本机代码。您必须将Python解释器嵌入到C++应用程序中,但是需要做的工作是文档化的。 here . 这是一个调用Python解释器并提取结果的例子(Python解释器定义C++中使用的对象类):

    object result = eval("5 ** 2");
    int five_squared = extract<int>(result);
    
        4
  •  1
  •   Aaron Fischer    16 年前

    您可以将C++项目中的公共语言运行时支持更改为/CLR。从这点上,您可以在C++代码中使用任何.NET功能。这也包括在项目中创建WinForms。您还可以添加处理UI和其他功能的C库。

        5
  •  0
  •   Ash    16 年前

    在.NET世界中,您始终可以选择为C/VB.NET程序集创建COM/ActiveX互操作层。

    然后,您可以使用C++应用程序中的普通COM API来创建实际包装您的.NET程序集的COM服务器实例。

    这方面的好处在于,简单的参数(如int、bool、string、float等)被映射到它们的COM等价物中。但是据我所知,不可能轻松地传递完整的.NET对象(您创建的类的实例)。

    还要注意,COM互操作调用相对较慢。在紧循环中,不应该从C++代码中连续调用COM互操作方法。

    COM/ActiveX传统上依赖于Windows注册表,这并不理想,因为它是一个很大的依赖项。但是也可以使用 Registration-Free COM互操作以避免此依赖关系。

    This article 介绍为COM互操作注册.NET程序集所需的步骤。