首页 > 解决方案 > 在源文件中使用#ifdefs 处理依赖于平台的行为?

问题描述

我正在开发可以在多个平台上运行的软件。我提供了一个包含所有公共 API 函数的通用头文件。实际的源文件将包含非常不同的代码,具体取决于编译它的平台。

我可以在同一个 .cpp 文件中处理所有平台,但我觉得这样很快就会变得一团糟。

下一个想法是,每个平台都有一个源文件,由包含平台特定代码的#ifdefs 包围。我觉得这是一种更干净的方式,因为错误的代码基本上甚至不存在于错误的平台上。我显然不是在寻找最好的方法,因为那是非常主观的。

  1. 这是处理依赖于平台的代码的一种可接受的方式,还是我犯了一个我遗漏的重大错误?
  2. 你会在中到高质量的代码库中找到这样的代码吗?
  3. 这种方法有什么主要缺点吗?

窗口.h:

#pragma once
class Window
{
    public:
        void Create();
};

Window_Win32.cpp:

#ifdef WINDOWS
#include "Window.h"

void Window::Create()
{
    // Win32 specific
}
#endif

Window_Linux.cpp:

#ifdef LINUX
#include "Window.h"

void Window::Create()
{
    // Linux specific
}
#endif

标签: c++c++11

解决方案


使用无数的#ifdef 来使用正确的平台是一场噩梦。但这是一种方式,一些著名的代码就是这样完成的。

我更喜欢为每个平台使用不同的 .h/.cpp,以及一些用于所有平台的通用代码的 .cpp。
.h 标头应包括通用对象/函数,并包括(通过#ifdefs)特定平台标头(仅具有该平台的对象/功能)。

使用这种方法,您需要为每个平台使用不同的配置/makefile/任何构建文件。


推荐阅读