在源文件中使用#ifdefs处理平台相关的行为?

时间:2018-10-20 18:09:48

标签: c++ c++11

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

我可以在同一个.cpp文件中处理所有平台,但是我觉得这真的会很快变得混乱。

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

  1. 这是处理平台相关代码的可接受方法吗? 我犯了一个我想念的重大错误?
  2. 您会在中等到高质量的代码库中找到这样的代码吗?
  3. 此方法是否有主要缺点?

Window.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

1 个答案:

答案 0 :(得分:1)

使用成千上万的#ifdef使用正确的平台是一场噩梦。但这是一种方法,而其中一些著名的代码就是这样做的。

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

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