c++ - 将指向 C++ 结构的指针传递给 Ada

标签 c++ ada

我在“MyData.h”中有一个 C++ 结构

struct MyData
{
    int a;
    int b;
};

我想将它的指针传递给 Ada 调用

#include "MyData.h"
extern "C" void ada_call(MyData* data);

void func()
{
    MyData* data = new MyData();
    ada_call(data);
}

如何构建接受此操作的 Ada 函数?

最佳答案

该解决方案有几个步骤。

您需要为该结构生成 Ada 记录。 g++ 有一个 built in tool for doing this 。运行:

g++ -c -fdump-ada-spec "MyData.h" -C

您将获得一个 mydata_h.ads,其中包含与您的结构匹配的记录定义。它应该看起来像这样:

with Interfaces.C; use Interfaces.C;

package MyData_h is

   type MyData is record
      a : aliased int;  -- MyData.h:3
      b : aliased int;  -- MyData.h:4
   end record;
   pragma Convention (C_Pass_By_Copy, MyData);  -- MyData.h:1

end MyData_h;

一旦有了它,您需要编写一个将其作为参数的过程。此过程必须将其作为“访问”传递,然后必须将其导出,以便可以从 C 访问它。

数据函数.ads:

with MyData_h;
use MyData_h;

package DATA_FUNCTION is
    procedure ADA_CALL ( DATA : access MyData_h.MyData );
    pragma Export(Convention=>C,Entity=>ADA_CALL,External_Name=>"ada_call");
end DataFunction;

数据函数.adb

with MyData_h;
use MyData_h;
with Interfaces.C; use Interfaces.C;

package body DATA_FUNCTION is

    procedure ADA_CALL ( DATA : access MyData_h.MyData )
    begin
        DATA.a = 1;
        DATA.b = 2;
    end ADA_CALL;
end DATA_FUNCTION;

关于c++ - 将指向 C++ 结构的指针传递给 Ada,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31146698/

相关文章:

c++ - 如何避免递归函数的堆栈溢出?

ada - 如何从抽象标记记录中设置和派生类型?

c++ - 用Qt序列化,不用Qt反序列化?

Ada程序检测行尾

exception - 如何检查输入内容?阿达语言

ada - "Subtype mark required in this context"到底是什么?

c++ - 程序退出,状态为 255 C++ Main with Ada

c++ - 功能永远不会在 Switch 语句中结束?

c++ - std::unordered_map 和由多个元素构建的键

C++语法创建一个没有参数的对象