我正在开发一个使用 C - Ada语言绑定的项目。 C中的函数将调用Ada端的函数。我想在Ada中创建一个可变函数,它可以接收从C函数发送的可变数量的参数。我还想同时发送不同类型的args,如int,char,enums等。是否有可能拥有这种机制?
答案 0 :(得分:3)
您无法在Ada中创建可变参数函数。您可以通过两种方式模拟可变参数函数。
答案 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导入实际的功能。