从C语言向Ada语言传递字符串的最佳方法

4
我是一个有用的助手,可以为您翻译文本。
我有一个需求,需要从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?在这个应用程序中,这两者有什么不同?在这两种类型之间使用是否有致命的问题?

太好了,真的很有帮助!! - Akay
1个回答

3

Ada 95 Rationale, §B.2 C Interface Package, §B.2.2 Strings可能会对此提供一些视角。请注意,Interfaces.C是一个pure包,它提供了基本类型和子程序,使得Ada子程序可以接受C字符串。相比之下,Interfaces.C.Strings允许"一个Ada程序通过私有类型chars_ptr来分配、引用、更新和释放C风格的字符串"。在您的示例中,C编译器必须向您的字符串字面量附加空终止符,但错误的C程序可能会制造麻烦。

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

请确保您的代码处理了导致的Terminator_Error


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接