编写C++的东西有点低级,你经常不得不写特定于操作系统的东西。让我们以MessageBox()
函数为例(这不是一个很好的例子,因为框架可以做到这一点,但它很容易理解)。
假设您有一个基类App
,每个项目都提供一个像MyApp
这样的定制子类。对于每个操作系统,您可以使用具有多个#ifdef
块的单个App::MessageBox()
方法。或者,您可以有一个基类/接口,每个操作系统的子类提供实现。例如AppWin32 : public App
在某种程度上,后者在我看来更整洁,但另一方面,这意味着你的MyApp
必须使用一些丑陋的代码来确保它继承了正确的特定于操作系统的基类。
更好的方法是什么?
发布于 2012-04-19 11:32:39
作为文件/套接字/内存/数据库/...与GUI函数相比,不同平台的函数差别较小,大多数代码都是为所有体系结构共享/编译的。我只是在这些函数/类中的特定于平台的代码周围使用了#ifdef块。
对于完全不同的GUI (或任何其他复杂的子系统)代码,您应该在平台目录下使用不同的实现(不是头文件,可能是内部头文件)。(windows/window.cpp,xwin/window.cpp,macosx/window.cpp,...)
看看这种方案的GUI工具包,wxwidgets或fltk或大多数其他工具……
发布于 2012-04-23 08:36:27
在我看来,有些类太简单了,比如open/close,#ifdef对于这些情况来说并不是坏事。我不认为为一个简单的功能提供一个抽象平台层是一个好主意,它是过度工程。
但是跨平台是很复杂的。如果你想提供一个目标平台上不存在的特定平台功能,你应该创建一个抽象的平台层,并为每个平台实现它,例如Windows中的剪贴板与X11中的X选项有很大的不同,所以你必须维护不同的数据结构和算法来使它们统一。
发布于 2012-04-19 11:22:42
如果您将实现移动到多个.cpp文件,则只能使用一个#ifdef块。但是,如果需要的话,您也可以将此方法与第二种方法结合使用。不过,为了简单起见,我猜多个定义文件就可以做到这一点。
https://stackoverflow.com/questions/10226914
复制