Len*_*mel 43 c c++ portability
我打算编写一个应该可以被广泛的平台上的大量人使用的库.我需要考虑什么来设计它?为了使这个问题更具体,最后有四个"子问题".
考虑到所有已知的要求和细节,我得出结论,用C或C++编写的库是可行的方法.我认为我的库的主要用途是在用C,C++和Java SE编写的程序中,但我也可以考虑从Java ME,PHP,.NET,Objective C,Python,Ruby,bash scrips中使用它的原因,等等......也许我无法针对所有这些,但如果有可能,我会做到的.
在这里描述我的库的全部目的将是很多,但有些方面可能对这个问题很重要:
当然,无论答案是满足我的具体要求,还是以一般方式回答问题,对更广泛的受众都有帮助,我们都欢迎回答!
以下是我在过去几个月收集的一些假设和结论:
Mar*_*ort 30
大多是正确的.直接的程序界面是最好的.(这与C btw(**)不完全相同,但足够接近)
我接口DLL很多(*),包括开源和商业,所以这里有一些我记得日常练习的要点,请注意这些是更值得研究的推荐区域,而不是基本的事实:
(**)这是因为"C"意味着二进制仍然依赖于使用的C编译器,特别是如果没有真正的通用系统ABI.想想像这样的东西:
=====自动标头转换====
虽然我不太了解SWIG,但我知道并使用了一些特定于delphi的头文件工具(h2pas,Darth/headconv等).
但是我从不在全自动模式下使用它们,因为通常不会输出很糟糕.注释更改行或被剥离,并且不保留格式.
我通常会制作一个小脚本(在Pascal中,但你可以使用任何具有良好字符串支持的东西)将头部分开,然后在相对同质的部分上尝试工具(例如,只有结构,或者只定义等).
然后我检查我是否喜欢自动转换输出,并使用它,或者尝试自己制作一个特定的转换器.由于它适用于子集(仅限于结构),因此通常比制作完整的标头转换器更容易.当然,这取决于我的目标是什么.(漂亮,可读的标题或快速和脏).在每一步,我可能会做一些替换(使用sed或编辑器).
我为Winapi commctrl和ActiveX/comctl标头做的最复杂的方案.在那里我结合了IDL和C头(接口的IDL,C中的一堆不可解析的宏,其余的C头),并设法获得大约80%的宏类型(通过传播sendmessage中的类型转换)宏返回宏声明,有合理的(wparam,lparam,lresult)默认值)
半自动方式的缺点是声明的顺序不同(例如,第一个常量,然后是结构,然后是函数声明),这有时会使维护变得困难.因此,我始终保持原始标题/ sdk与之比较.
Jedi winapi转换项目可能有更多的信息,他们将大约一半的Windows标题翻译成Delphi,因此拥有丰富的经验.