C++ 如何设计C/C++;库是否可以在多种客户端语言中使用?
我正计划编写一个库,该库应该可以在各种平台上供大量用户使用。我需要考虑什么来设计它呢?为了使这个问题更具体,在最后有四个“子问题” 语言选择 考虑到所有已知的需求和细节,我得出结论,用C或C++编写的图书馆是一条出路。我认为我的库的主要用途将是在<>强> C、C++和JavaSe<强>中编写的程序,但我也可以想到从<强> java java、php、.net、目标C、python、红宝石、Bash脚本等……使用它的原因。 要求 在这里描述我的图书馆的全部用途可能会有很多,但有一些方面可能对这个问题很重要:C++ 如何设计C/C++;库是否可以在多种客户端语言中使用?,c++,c,portability,C++,C,Portability,我正计划编写一个库,该库应该可以在各种平台上供大量用户使用。我需要考虑什么来设计它呢?为了使这个问题更具体,在最后有四个“子问题” 语言选择 考虑到所有已知的需求和细节,我得出结论,用C或C++编写的图书馆是一条出路。我认为我的库的主要用途将是在强> C、C++和JavaSe中编写的程序,但我也可以想到从 java java、php、.net、目标C、python、红宝石、Bash脚本等……使用它的原因。 要求 在这里描述我的图书馆的全部用途可能会有很多,但有一些方面可能对这个问题很重要: 这
- 这个库本身一开始很小,但肯定会变得非常复杂,因此不能同时维护多个版本
- 不过,大部分复杂性将隐藏在库中
- 该库将构造一个在内部大量使用的对象图。库的一些客户端只对特定对象的特定属性感兴趣,而其他客户端必须以某种方式遍历对象图
- 客户可以更改对象,必须通知库
- 库可能会更改对象,如果客户端已经拥有该对象的句柄,则必须通知客户端
- 该库必须是多线程的,因为它将保持与其他几个主机的网络连接
- 虽然对库的某些请求可能会同步处理,但其中许多请求会花费太长时间,必须在后台处理,并在成功(或失败)时通知客户端
- 但我的接口必须是干净的C接口,不涉及名称混乱
- 此外,我认为我的接口应该只包含函数,基本/基本数据类型(可能还有指针)作为参数和返回值传递
- 如果我使用指针,我认为我应该只使用它们将它们传递回库,而不是直接对引用的内存进行操作 <> LI>在C++应用程序中,我也可能提供面向对象的接口(它也易于命名,因此应用程序必须使用相同的编译器,或者包含源代码库)
- C#中的用法也是这样吗
- 对于在JavaSE/JavaEE中的使用,Java本机接口(JNI)适用。我对它有一些基本的了解,但我一定要仔细检查一下
- 并非所有的客户端语言都能很好地处理多线程,因此应该有一个线程与客户端通信
- 对于JavaMe的使用,没有JNI这样的东西,但我可能会使用它
- 要在Bash脚本中使用,必须有一个带有命令行界面的可执行文件
- 对于其他客户端语言,我不知道
- 对于大多数客户机语言,最好有一种用这种语言编写的适配器接口。我认为有一些工具可以为Java和其他一些工具自动生成这个
- 对于面向对象的语言,可以创建一个面向对象的适配器,它隐藏了一个事实,即库的接口是基于函数的——但我不知道这是否值得
- 这是可行的管理工作,还是只是太多的可移植性
- 有关于这种设计标准的好书/网站吗
- 我的假设有错吗
- 哪些开源库值得从它们的设计/接口/资源中学习
- 梅塔:这个问题很长,你有没有办法把它分成几个小问题?(如果您对此作出答复,请将其作为评论,而不是回答)
- 注意装饰和类似的“次要”损坏方案,特别是如果您使用MS编译器。最值得注意的是,stdcall约定有时会为了VB而产生装饰(装饰是在函数符号名称后面加上@6之类的东西)
- 并非所有编译器都可以实际布局所有类型的结构:
- 因此,避免过度使用工会
- 避免乱扔垃圾
- 最好是打包32位x86的记录。虽然理论上速度较慢,但至少所有编译器都可以访问afaik中的压缩记录,随着体系结构的发展,官方的对齐要求也随着时间的推移而变化
- 在Windows上使用stdcall。这是Windows DLL的默认设置。避免fastcall,它不是完全标准化的(特别是传递小记录的方式)
- 一些提示,使自动化他