Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何设计C/C++;库是否可以在多种客户端语言中使用?_C++_C_Portability - Fatal编程技术网

C++ 如何设计C/C++;库是否可以在多种客户端语言中使用?

C++ 如何设计C/C++;库是否可以在多种客户端语言中使用?,c++,c,portability,C++,C,Portability,我正计划编写一个库,该库应该可以在各种平台上供大量用户使用。我需要考虑什么来设计它呢?为了使这个问题更具体,在最后有四个“子问题” 语言选择 考虑到所有已知的需求和细节,我得出结论,用C或C++编写的图书馆是一条出路。我认为我的库的主要用途将是在强> C、C++和JavaSe中编写的程序,但我也可以想到从 java java、php、.net、目标C、python、红宝石、Bash脚本等……使用它的原因。 要求 在这里描述我的图书馆的全部用途可能会有很多,但有一些方面可能对这个问题很重要: 这

我正计划编写一个库,该库应该可以在各种平台上供大量用户使用。我需要考虑什么来设计它呢?为了使这个问题更具体,在最后有四个“子问题”

语言选择 考虑到所有已知的需求和细节,我得出结论,用C或C++编写的图书馆是一条出路。我认为我的库的主要用途将是在<>强> C、C++和JavaSe<强>中编写的程序,但我也可以想到从<强> java java、php、.net、目标C、python、红宝石、Bash脚本等……使用它的原因。 要求 在这里描述我的图书馆的全部用途可能会有很多,但有一些方面可能对这个问题很重要:

  • 这个库本身一开始很小,但肯定会变得非常复杂,因此不能同时维护多个版本
  • 不过,大部分复杂性将隐藏在库中
  • 该库将构造一个在内部大量使用的对象图。库的一些客户端只对特定对象的特定属性感兴趣,而其他客户端必须以某种方式遍历对象图
  • 客户可以更改对象,必须通知库
  • 库可能会更改对象,如果客户端已经拥有该对象的句柄,则必须通知客户端
  • 该库必须是多线程的,因为它将保持与其他几个主机的网络连接
  • 虽然对库的某些请求可能会同步处理,但其中许多请求会花费太长时间,必须在后台处理,并在成功(或失败)时通知客户端
当然,无论答案是否符合我的具体要求,或者是否以一种对更广泛的受众很重要的一般方式回答问题,我们都欢迎您的回答

我的假设,到目前为止 以下是我在过去几个月里收集的一些假设和结论:

    内部我可以使用我想要的任何东西,例如C++与运算符重载、多重继承、模板元编程…只要有一个可移植的编译器来处理它(想想gcc/g++)
  • 但我的接口必须是干净的C接口,不涉及名称混乱
  • 此外,我认为我的接口应该只包含函数,基本/基本数据类型(可能还有指针)作为参数和返回值传递
  • 如果我使用指针,我认为我应该只使用它们将它们传递回库,而不是直接对引用的内存进行操作
  • <> LI>在C++应用程序中,我也可能提供面向对象的接口(它也易于命名,因此应用程序必须使用相同的编译器,或者包含源代码库)
  • C#中的用法也是这样吗
  • 对于在JavaSE/JavaEE中的使用,Java本机接口(JNI)适用。我对它有一些基本的了解,但我一定要仔细检查一下
  • 并非所有的客户端语言都能很好地处理多线程,因此应该有一个线程与客户端通信
  • 对于JavaMe的使用,没有JNI这样的东西,但我可能会使用它
  • 要在Bash脚本中使用,必须有一个带有命令行界面的可执行文件
  • 对于其他客户端语言,我不知道
  • 对于大多数客户机语言,最好有一种用这种语言编写的适配器接口。我认为有一些工具可以为Java和其他一些工具自动生成这个
  • 对于面向对象的语言,可以创建一个面向对象的适配器,它隐藏了一个事实,即库的接口是基于函数的——但我不知道这是否值得
可能的子问题
  • 这是可行的管理工作,还是只是太多的可移植性
  • 有关于这种设计标准的好书/网站吗
  • 我的假设有错吗
  • 哪些开源库值得从它们的设计/接口/资源中学习
  • 梅塔:这个问题很长,你有没有办法把它分成几个小问题?(如果您对此作出答复,请将其作为评论,而不是回答)

我不知道,但是如果它是针对Windows的,那么您可以尝试直接使用类似C的API(类似于WINAPI),或者将代码打包为COM组件:因为我猜编程语言可能希望能够调用Windows API和/或使用COM对象。

基本正确。直接的程序界面是最好的。(与C btw(**)不完全相同,但足够接近)

我对DLL进行了大量的接口(*),包括开源和商业,因此我从日常实践中记住了一些要点,请注意,这些是更值得推荐的研究领域,而不是基本事实:

  • 注意装饰和类似的“次要”损坏方案,特别是如果您使用MS编译器。最值得注意的是,stdcall约定有时会为了VB而产生装饰(装饰是在函数符号名称后面加上@6之类的东西)
  • 并非所有编译器都可以实际布局所有类型的结构:
    • 因此,避免过度使用工会
    • 避免乱扔垃圾
    • 最好是打包32位x86的记录。虽然理论上速度较慢,但至少所有编译器都可以访问afaik中的压缩记录,随着体系结构的发展,官方的对齐要求也随着时间的推移而变化
  • 在Windows上使用stdcall。这是Windows DLL的默认设置。避免fastcall,它不是完全标准化的(特别是传递小记录的方式)
  • 一些提示,使自动化他