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

问题描述 投票:6回答:4

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

c variadic-templates ada variadic-functions
4个回答
3
投票

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

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

2
投票

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

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

特别是AMD64 ABI指定:

%rax - 带有可变参数传递有关所用向量寄存器数量的信息

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

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


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";

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导入实际的功能。

© www.soinside.com 2019 - 2024. All rights reserved.