Ada to C++:传递无符号的64位值

Xee*_*lot 7 c++ interface ada

我需要将Ada程序中的2个数据传递给某些C++代码进行处理.

  • 数据 - 加倍.
  • 时间 - 无符号64位.

我能够使用Long_Float(C++中的double)和Integer(C++中的int,显然不是64位)在Ada中创建一个使用我的C++方法的过程.我使用了以下代码(代码不在我身上,因此语法可能稍微偏离):

procedure send_data (this : in hidden_ptr; data : in Long_Float; time : in Integer);
pragma import (CPP, send_data, "MyClass::sendData");
Run Code Online (Sandbox Code Playgroud)

现在,这是有效的,我正在尝试将时间扩展到完整的64位,并且理想情况下希望在C++端有一个无符号长整数.我没有在Ada中看到任何与之匹配的类型,因此我创建了自己的类型:

type U64 is mod 2 ** 64;
Run Code Online (Sandbox Code Playgroud)

当我的send_data方法使用该类型时,我得到一个错误,说没有可能的方法将该类型映射到C++类型(沿着这些行,同样没有代码或确切的错误短语在我身上).

有没有办法将Ada中的用户定义类型传递给C++?也许在Ada中有另一种类型我可以用作无符号的64位值吗?有没有办法将我的U64类型的地址作为参数传递给C++方法,如果这更容易?我正在使用绿山adamulti编译器v3.5(非常新的ada,不知道该信息是否有帮助).举例非常感谢!

T.E*_*.D. 1

作为@KeithThompson 的评论/答案的附录......

Ada 官方支持的 C 接口类型位于Interfaces.C中,并且那里没有 extra-long int 或 unsigned(2005 版本中。2012 版本正式了吗?)。

你做了正确的事情来解决这个问题。如果您的编译器不支持这一点,则必须采取更严厉的措施。

第一个明显要尝试的事情是通过引用传递 64 位 int。但这需要在 C 端进行更改。

我知道 C/C++ TIME 结构往往是 64 位值,定义为联合结构。因此,您可以做的是定义一个 Ada 记录来模仿这些 C 结构之一,确保它按照 C 的方式进行布局(例如:使用记录表示和大小子句),然后使该对象成为您导入的例程所使用的对象它的参数。

之后,您将不得不使用令人讨厌的参数技巧。例如,您可以尝试将参数的 Ada 导入端更改为 64 位浮点数,将实际参数 unchecked_converting 为 64 位浮点数,然后尝试以这种方式传递它。问题在于,许多 CPU 的 pass 浮点在与 int 不同的寄存器中。所以这可能行不通,而且如果行得通,那么它肯定是不可移植的。

如果您弄清楚编译器的 CPP 调用约定是如何工作的,很可能还有其他方法可以伪造它。例如,如果它使用两个相邻的 32 位寄存器来传递 64 位 int,您可以将 Ada 64 位 int 拆分为两个,并将其传递到 Ada 端的两个参数中。如果它通过引用传递 64 位值,您可以告诉 Ada 端您正在传递一个指向 U64 的指针。再次强调,这些解决方案并不便携,但它们可以帮助您继续前进。