从C头文件自动生成Delphi/Freepascal接口单元

8

是否可以从C头文件自动生成接口单元?特别是,我想包装HDF5库,如果能够避免手动编写接口单元就太好了。


那看起来是一个非常庞大而复杂的库。我可以自信地预测,没有任何工具能够进行良好且全面的翻译。 - David Heffernan
1
这里有 hdf 库版本 4 的 Delphi 部分翻译链接。您可以在 Drivers 文件夹下找到它。它可能作为翻译的第一步。 - LU RD
问题在于HDF4和HDF5除了名字中的“HDF”之外没有任何共同点... - andreas-h
4个回答

12

自由的Pascal包括 H2PAS 工具。

h2pas 试图将C头文件转换为Pascal单元。它可以处理大多数C头文件中的C结构,并试图将它们翻译成对应的Pascal代码。


它比我用过的其他工具要好得多,但在实践中,你仍然需要手动进行大量的后期处理。 - Jeroen Wiert Pluimers

5
一般来说,将C语言头文件完全自动翻译为其他语言(不是需要的C功能的有效超集)很难甚至不可能。这是因为由于宏,我们无法看到如何翻译它们。宏通常只有在上下文中才有意义。例如:
#define uglymacro 1,2,3,4

还有一个更为普遍的情况是:

SCARYAPIMACRO void func(int c);

SCARYAPIMACRO通常是一个宏,它测试操作系统定义以选择正确的调用约定和正确的操作系统/架构。

但这并不意味着工具不是真正的时间节省者。但结果更多是半自动化的,我对h2pas有最多和最好的经验。

我已经翻译了很多Windows头文件(包括FPC的commctrl,其中每几行都有一个sendmessage宏)。

我通常会编写一个小的Pascal程序,基于行扫描源代码,并使用启发式算法将其分成大部分同质的部分(所有结构或常量、宏、过程声明等)。然后我查看源代码并经常进行全局替换。

只有在此之后,我才将其通过翻译器运行,该过程通常是迭代的(优化分离、进行全局替换、尝试翻译,如果失败,则再次尝试等)。

不幸的是,这个过程需要对C语言有很好的掌握,包括#pragma内容。


5
Bob Swart(Dr Bob)有一个实用程序,可以转换许多头文件(虽然通常也需要一些手动工作),称为HeaderConvert。我从未将其与@RRUZ链接的工具进行比较,但这是另一个选择。 Project JEDI也有一个;我从未测试过它。您可以在此处找到它。

Jedi版本基本上与headconv相同。 - Marco van de Voort

1

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