编写有点低级的C ++东西,你经常需要编写特定于操作系统的东西。我们以MessageBox()
函数为例(不是一个很好的例子,因为框架可以做到这一点,但很容易理解)。
假设您有一个基础App
类,每个项目都提供一个自定义子类,如MyApp
。对于每个操作系统,您可以使用单个App::MessageBox()
方法,其中包含多个#ifdef
块。或者,您可以拥有基类/接口,每个OS子类提供实现。例如AppWin32 : public App
在某种程度上,后者似乎更适合我,但另一方面,这意味着你的MyApp
必须使用一些丑陋的代码来确保它是正确的特定于操作系统的基类的子类。
什么是更好的方法?
答案 0 :(得分:2)
由于文件/套接字/内存/数据库/ ...函数在平台之间的差别比GUI函数差,因此大多数代码都是针对所有体系结构共享/编译的。我只是在这些函数/类中的平台特定代码周围使用#ifdef块。
对于完全不同的GUI(或任何其他复杂子系统)代码,您应该在平台目录下使用不同的实现(不是标题,可能是内部标题)文件。 (windows / window.cpp,xwin / window.cpp,macosx / window.cpp,...)
看看这个方案的GUI工具包,wxwidgets或fltk或其他大多数......
答案 1 :(得分:1)
但跨平台很复杂。如果要提供目标平台中不存在的特定平台功能,则应创建一个抽象平台层并为每个平台实现它,例如: Windows中的剪贴板与X11中的X选择有很大不同,因此您必须维护不同的数据结构和算法以使它们统一。
答案 2 :(得分:0)
如果将实现移动到多个.cpp文件,则只能使用一个#ifdef块。你也可以将它与第二个方法结合起来,但是,如果需要的话。尽管如此,为了简单使用,我猜多个定义文件也可以解决问题。
答案 3 :(得分:0)
#ifdef定义为最差的。
我会将特定于平台的代码放在单独的源树中(每个平台一棵树)。从项目位置(对于特定平台),可以使用2个文件系统链接 - 到“通用”树(例如,命名为“src”)和平台特定树(例如,命名为“specific”,实际上指向linux,windows或其他特定于平台的源根目录。 这可以保证您始终选择正确版本的classees。此外,您甚至可以为为不同平台设计的类似类提供相同的名称。
当然,在使用FAT文件系统的Windows下这种方法是不可能的,但现在这种情况非常罕见(因为通常没有理由不在Windows下使用NTFS)。