将字符串从 C 传递到 Ada 的最佳方式

问题描述 投票:0回答:1

我有一个要求,需要将字符串从 C 函数传递到 Ada 函数(C-Ada 绑定应用程序)。

C 函数:

extern void ada_func_print_string(char*);
void Pass_String()
{
  char str[] = "Hello_Ada";
  ada_func_print_string(str);
}

阿达功能:

规格:

pragma Export (Convention    => C,
               Entity        => Ada_Print_String,
               External_Name => "ada_func_print_string");

身体:

procedure Ada_Print_String (C_Source : Interfaces.C.char_array)
   Ada_Str : String := Interfaces.C.To_Ada(Item     => C_Source,
                                           Trim_Nul => True);
begin
   Ada.Text_IO.Put_Line(Ada_Str);       
end Ada_Print_String;

上面的代码几乎可以正常工作,没有任何麻烦。我的问题是形参C_Source的声明是否最好是Interfaces.C.char_array还是应该更好地是Interfaces.C.Strings.chars_ptr?就这个应用而言,两者有什么区别?这两种类型在这里使用有没有致命性?

c string ada
1个回答
3
投票

Ada 95 基本原理、§B.2 C 接口包、§B.2.2 字符串 可能会对此提供一些观点。请注意,

Interfaces.C
是一个pure包,它提供了basic类型和子程序,允许Ada子程序接受C字符串。相反,
Interfaces.C.Strings
允许“Ada 程序通过私有类型
chars_ptr
分配、引用、更新和释放 C 风格字符串”。在您的示例中,C 编译器必须 在字符串文字中附加一个空终止符,但错误的 C 程序可能会造成恶作剧。

char str[] = {'H','e','l','l'};

验证您的代码是否可以处理结果

Terminator_Error

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