如何从 Ada 调用 scanf ?也就是说,大概有一个适当的 pragma import 声明,但是声明会是什么样子呢?
(我感兴趣的是如何从 Ada 调用更难以驾驭的 C 函数,而不是如何解析字符串本身,所以我不是在寻找纯粹的 Ada 解决方案。我的设置是 Gnat、Ubuntu Linux、x64(如果可以)有所作为。)
这张纸指出
Ada 无法声明采用不同数量、不同类型的参数的函数。可以声明一组“printf”函数,这些函数接受一个字符串、一个字符串和一个整数、一个字符串和一个浮点数、一个字符串和 2 个整数等等,然后将每个函数声明为 Import (C) 2.但这需要大量的声明,一个声明用于应用程序中的每一种不同的用途,所以它确实不切实际。
同样的情况也适用于scanf()
,Ada 2012 的额外好处是让您可以选择out
and access
参数规格(在早期版本中,您必须使用access
因为函数不允许有out
参数)。
此外,我不认为 C 编译器必须对可变参数函数使用与普通函数相同的参数传递机制(参考资料暗示了这一点,我记得但现在找不到最近关于这些的对话)。
也就是说,这里有一个在带有 GCC 4.6.0 的 Mac OS X 上运行良好的示例:
with Ada.Text_IO; use Ada.Text_IO;
with Interfaces.C; use Interfaces.C;
procedure Variadic is
function Scanf (Fmt : char_array; Result : access int) return int;
pragma Import (C, Scanf, "scanf");
Status : int;
Result : aliased int;
begin
Status := Scanf (To_C ("%d\n"), Result'Access);
Put_Line ("status: " & int'Image (Status));
if Status = 1 then
Put_Line ("result: " & int'Image (Result));
end if;
end Variadic;
(不确定\n
在格式参数中!)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)