用C ++编写多个平台实现

时间:2017-01-18 00:52:14

标签: c++ c oop operating-system cross-platform

我的目标是编写每个操作系统具有不同实现的函数。

有些项目是这样做的:

system.h
system_win.cpp
system_osx.cpp
system_linux.cpp
etc...

哪个有道理。然后说你需要与某个操作系统有关的局部变量,你只需要创建system_win.h。这种技术可以使你的代码具有很强的可读性,但是管理每个操作系统编译的文件非常挑剔。

然后一些项目大量使用#ifdef。这种技术的问题是代码可能会非常混乱。

我的来源需要具有可读性。但也需要有意义。

什么是最好的?为什么?

3 个答案:

答案 0 :(得分:0)

您可以为该用户创建system_win.h。在system.h中,使用#ifdef确定正在使用的操作系统用户,并为其添加正确的标头。

答案 1 :(得分:0)

C ++以翻译单位运作。许多IDE和构建系统(甚至是跨平台的)将您生成的应用程序视为链接在一起的多个编译单元。根据您的描述,您希望构建一个system编译单元。所以

制作公共接口标头(这里没有实现细节,一切都很好,干净)。它包含公共接口,对应的应用程序可见。

// system.h
int function_open(char*);

制作私人实施源

// system.cpp

int function_open(char*a)
{
#if defined(__MSWIN__)
  ::Create(a)
#elif defined(__OSX__)
  ::open(a)
#endif
}
  

这种技术(ifdefs)的问题是代码可能会非常混乱。

有些条件是必须的。你是将它们作为ifdef放在你的源代码中,还是作为makefiles / meta-makefiles中的一些凌乱的条件编译指令。 在我的实践中,我们尝试将操作系统独立性保持在可能的最低抽象级别。我们将操作系统依赖性包含在内,因此其他翻译单元中的任何其他人都不需要查看实际的实现。

明智地选择您的构建系统(例如考虑cmake)。根据您的构建系统,其他实现也是可能的(例如私有和公共头部实际驻留在不同的位置)。

答案 2 :(得分:0)

我建议使用特定于平台的源文件而不是#ifdef。正如你所说,它是更易于管理的方法。

如果您需要特定于平台的头文件,我发现一个好的方法是给它们所有相同的文件名,但将它们放在不同的特定于平台的目录中:

windows/abc/foo.hpp
linux/abc/foo.hpp
osx/abc/foo.hpp

只有与目标平台对应的目录才会添加到标题搜索目录列表中。然后,您可以正常包含标题,并自动选择正确的标题:

#include <abc/foo.hpp>

如果您想要在平台之间共享一些通用代码,则可以创建&#34; private&#34;特定于平台的头文件并使&#34; public&#34;所有平台共有的标题:

windows/abc/detail/foo_platform.hpp
linux/abc/detail/foo_platform.hpp
osx/abc/detail/foo_platform.hpp
common/abc/foo.hpp

然后在foo.hpp内:

#include <abc/detail/foo_platform.hpp>