跨平台 C++:将 OS-细节包装在 class 后面

Cross-platform C++: wrapping OS-specifics behind a class

我正在开发一个 C++ 项目,它应该 运行 在 Linux 和 Windows 7+ 上。这也是我在几年前参加了非常简单和简短的基础课程后使用 C++ 的第一周。

假设我需要访问文件系统,但是由于 OS 有不同的 API,我需要创建一个包装器 class 来使事情保持一致。

以下是否可行:

有基础classFile。我从文件中继承 WinFileLinuxFile,它们实现了基础 class public 方法(例如 createFilereadFile 等)。然后在两个子 classes 中,我实现 public 方法以映射到特定于平台的方法(WINAPI 文件处理和 UNIX 文件处理)。

然后我会使用预处理器指令在主应用程序中有条件地加载 WinFileLinuxFile

int main()
{
    #if defined WIN32
    WinFile fileSystem;
    #elif defined LINUX
    LinuxFile fileSystem;
    #endif

    // Both of above contain the same public method API.

    std::string filedata;
    filedata = fileSystem.readFile(...);

    ...
}

我的直觉告诉我这应该可行,但是有什么缺点吗?这会很容易成为可维护性问题吗?预处理器指令是否被视为 "hacks" 之类的?我知道它们与 header include guards 等一起使用,但它们是与编译器相关的逻辑,而不是与应用程序相关的逻辑。

还有其他方法可以实现我在这里尝试做的事情吗?

您可以在头文件中定义 API 并将实现移动到 cpp 文件中。 添加依赖于您的 os 的 .cpp 源文件(或通过 macros 保护 .cpp 文件,例如:

// File.h
class File
{
public:
    void open(std::string);
};

// File_impl_win.cpp (compiled when win)
void File::open(std::string)
{
    // impl
}

// File_impl_lin.cpp (compiled when linux)
void File::open(std::string)
{
    // impl
}

优点是您不需要区分 LinuxFile 和 WindowsFile,您只需要一个 api。

但是已经有一个很棒的 crossplatform boost 文件系统使用库,boost filesystem,您可以使用它。