是否可以从 C 头文件自动生成接口单元?特别是,我想包装HDF5库,如果我可以避免手动编写接口单元,那就太好了。
4 回答
免费的 pascal 包括H2PAS工具。
h2pas尝试将 C 头文件转换为帕斯卡单位。它可以处理在 C 头文件中找到的大多数 C 构造,并尝试将它们转换为它们的帕斯卡对应物。
Bob Swart ( Dr Bob ) 有一个实用程序,它可以转换很多头文件(尽管通常也涉及一些手动工作),称为HeaderConvert。我从未将它与工具@RRUZ 链接进行比较,但这是另一种选择。
通常,将 C 标头全自动转换为其他内容(这不是所需 C 功能的有效超集)几乎是不可能的。
这是因为由于宏,人们看不到如何翻译它们。宏通常只能从上下文中获取其含义。例子
#define uglymacro 1,2,3,4
而且(这个更常见):
SCARYAPIMACRO void func(int c);
SCARYAPIMACRO 通常是一个宏,用于测试操作系统定义以选择正确的操作系统/架构的正确调用约定。
不过,这并不意味着这些工具不能真正节省时间。但结果是更半自动的,我对 h2pas 有最多和最好的体验。
我已经翻译了很多 Windows 标头(包括 FPC 的 commctrl,它每隔几行就有一个 sendmessage 宏)。
我通常做的是制作一个小的 pascal 程序,它扫描基于行的源代码并使用启发式方法将其拆分为大部分同质的部分(所有结构或常量、宏、过程声明等)。然后我看源码,经常做一些全局替换。
只有这样我才能通过翻译器运行它,该过程通常是迭代的(细化分离,进行全局替换,尝试翻译,如果失败,再试一次等)。
不幸的是,这个过程确实需要很好地掌握 C,包括 pragma 的东西。
您可以从我的页面下载 HDF5 API 标头 Delphi 翻译、带有源代码的 Delphi XE2 HDF5 表测试程序和稍加修改的 hdf5dll: http ://www.astro.ff.vu.lt/index.php?option=com_content&task=view&id= 46&Itemid=63