我有一个要求,我需要将字符串从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 ?两者在这个应用方面有什么区别?这两种类型中有没有使用死亡?
答案 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
。