我有一个Ada.Strings.Unbounded.Unbounded_String
,我想将它传递给一个 C 函数,该函数需要一个char *
(Interfaces.C.chars_ptr
在 Ada 中)。
我当前的实现涉及将无界字符串复制到固定字符串,然后将固定字符串复制到chars_ptr
.
F_String : String := To_String (UB_String);
C_String : chars_ptr := New_String (F_String);
请注意,这复制了两次,最后我只是打电话
Imported_Function (C_String);
Free (C_String);
并丢弃F_String
。
我可以使用最少的复制来实现所需的行为(将无界字符串中保存的字符串传递给导入的 C 函数)吗?理想情况下,将内部缓冲区 UB_String
直接传递给函数会很酷,但这可能不是可移植的。我至少可以在不需要中间固定字符串的情况下实现相同的行为吗?
我看到 GNAT 有一个内部包Ada.Strings.Unbounded.Aux
,它允许您访问无界字符串的内部缓冲区,但这不是可移植的,并且可能会在 GNAT 版本之间中断。