【问题标题】:Can you call Ada functions from C++?你能从 C++ 中调用 Ada 函数吗?
【发布时间】:2008-11-01 16:28:04
【问题描述】:

我是一个完整的 Ada 新手,虽然我在 HS 期间使用了 2-3 年的 Pascal。

IIRC,可以从 C/C++ 调用 Pascal 编译函数。是否可以从 C++ 调用用 Ada 编写的过程和函数?

【问题讨论】:

    标签: c++ c ada cross-language


    【解决方案1】:

    按照这个old tutorial,应该是可以的。

    但是,如 this thread 所示,您必须小心 Ada 函数的 c++ extern "C" 定义。

    【讨论】:

    • 回到我的 Ada 时代,我用 Ada 编写库,并且能够在 C 程序中引用它们,所以这当然是可能的。
    【解决方案2】:

    这是一个使用 g++/gnatmake 5.3.0 的示例:

    注意:在 C++ 和 Ada 之间传递数据时要小心

    ada_pkg.ads

        package Ada_Pkg is
            procedure DoSomething (Number : in Integer);
            pragma Export (C, DoSomething, "doSomething");
        end Ada_Pkg;
    

    ada_pkg.adb

        with Ada.Text_Io;
        package body Ada_Pkg is
            procedure DoSomething (Number : in Integer) is
            begin
                Ada.Text_Io.Put_Line ("Ada: RECEIVED " & Integer'Image(Number));
            end DoSomething;
        begin
            null;
        end Ada_Pkg;
    

    ma​​in.cpp

        /*
        TO BUILD:
        gnatmake -c ada_pkg
        g++ -c main.cpp
        gnatbind -n ada_pkg
        gnatlink ada_pkg -o main --LINK=g++ -lstdc++ main.o
        */
    
        #include <iostream>
    
        extern "C" {
            void doSomething (int data);
            void adainit ();
            void adafinal ();
        }
    
        int main () {
            adainit(); // Required for Ada
            doSomething(44);
            adafinal(); // Required for Ada 
            std::cout << "in C++" << std::endl;
            return 0;
        }
    

    参考资料:

    【讨论】:

      【解决方案3】:

      这种事情一直都在做。诀窍是告诉双方对例程使用“C”风格的调用协议。在 C++ 中,这是通过 extern "C" 声明完成的,而在 Ada 端,则使用 pragma Export ("C", ...

      在您最喜欢的相应参考来源中查找这些内容以获取详细信息。注意指针和引用参数!

      【讨论】:

        【解决方案4】:

        绝对有可能。在过去的五年里,我一直致力于开发一个混合了 C++ 和 Ada 的系统。

        【讨论】:

        • 同意你回答他的问题 - 但它没有提供很多见解。
        • 恐怕我没有比这更多的洞察力了。我还没有处理接口代码。但是,OP问了一个是/否的问题。 8v)
        • 一个链接或一个例子会很好;)
        【解决方案5】:

        是的。几年前,我写了一个简短的简单演示来证明这一点。有两个 DLL,一个用 C++ 编写,另一个用 Ada 编写。他们只是将常量添加到浮点值。两个应用程序,一个在 C++ 中,一个在 Ada 中,每个都使用 DLL。因此,从 Ada 调用/调用的 C++ 的所有可能组合都存在。这一切都很好。这在 Windows 上是当时最新的版本;我不记得了,但可能是在 Linux 或 BeOS 上运行的。

        如果我能从中找到源代码就好了……

        【讨论】:

          猜你喜欢
          • 2011-04-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-28
          • 1970-01-01
          • 2023-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多