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

时间:2016-05-13 06:59:41

标签: c string ada

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

C函数:

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

Ada功能:

规格:

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 ?两者在这个应用方面有什么区别?这两种类型中有没有使用死亡?

1 个答案:

答案 0 :(得分:3)

Ada 95 Rationale, §B.2 C Interface Package, §B.2.2 Strings可能会对此提供一些看法。请注意,Interfaces.C是一个pure包,提供基本类型和子程序,允许Ada子程序接受C字符串。相比之下,Interfaces.C.Strings允许Ada程序分配,引用,更新和释放C风格的字符串"通过私人类型chars_ptr。在您的示例中,C编译器must在字符串文字中附加一个空终止符,但错误的C程序可能会造成恶作剧。

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

验证您的代码是否处理了生成的Terminator_Error