Ada中的变异函数(C - Ada绑定)?

时间:2016-03-05 19:50:02

标签: c variadic-templates ada variadic-functions

我正在开发一个使用 C - Ada语言绑定的项目。 C中的函数将调用Ada端的函数。我想在Ada中创建一个可变函数,它可以接收从C函数发送的可变数量的参数。我还想同时发送不同类型的args,如int,char,enums等。是否有可能拥有这种机制?

4 个答案:

答案 0 :(得分:3)

您无法在Ada中创建可变参数函数。您可以通过两种方式模拟可变参数函数。

  1. Ada允许您指定功能和过程的默认值。如果要使用默认值,则无需始终指定默认参数的值。
  2. 您可以将一个或多个参数定义为变体记录。

答案 1 :(得分:2)

无法以便携方式从Ada调用任何C变量函数

其中一个原因是 - 某些ABI使用特殊方式/寄存器来传递浮点值。这意味着C编译器将使用此寄存器,因为事先未知参数是否为float。 Ada编译器不会使用这个寄存器(因为你不能把浮点参数放在Ada包装函数声明中)。因此,您将崩溃,堆栈损坏或任何其他未定义的行为。

特别是AMD64 ABI指定:

  

%rax - 使用变量参数传递信息   关于使用的向量寄存器的数量

     

%xmm0-%xmm1 - 用于传递和返回浮动   点参数

唯一可移植的解决方案是使用带有固定数量参数的C包装器,然后像往常一样绑定它。

答案 2 :(得分:2)

即将发布的Ada标准Ada 202x计划为调用C可变参数提供支持。

您将可以写信;

package C renames Interfaces.C;

procedure Printf (Format : in C.char_array)
  with Import => True, Convention => C_Variadic_1, External_Name => "printf";

答案 3 :(得分:0)

您可以使用'地址或包System.Address_To_Access_Conversions和'access(或'unchecked_access)来生成您想要传递的每个项目的地址。

   type Address_Array is array (positive range <>) of System.address;
   function C_Caller(Params : Address_Array) return Integer is begin return 0; end;
   X, Y, Z, Result : Integer;
begin
   result := C_Caller(Address_Array'(x'address, y'address, z'address));

...然后你需要pragma导入实际的功能。