c++ - 在源文件中使用#ifdefs 处理依赖于平台的行为?
问题描述
我正在开发可以在多个平台上运行的软件。我提供了一个包含所有公共 API 函数的通用头文件。实际的源文件将包含非常不同的代码,具体取决于编译它的平台。
我可以在同一个 .cpp 文件中处理所有平台,但我觉得这样很快就会变得一团糟。
下一个想法是,每个平台都有一个源文件,由包含平台特定代码的#ifdefs 包围。我觉得这是一种更干净的方式,因为错误的代码基本上甚至不存在于错误的平台上。我显然不是在寻找最好的方法,因为那是非常主观的。
- 这是处理依赖于平台的代码的一种可接受的方式,还是我犯了一个我遗漏的重大错误?
- 你会在中到高质量的代码库中找到这样的代码吗?
- 这种方法有什么主要缺点吗?
窗口.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
解决方案
使用无数的#ifdef 来使用正确的平台是一场噩梦。但这是一种方式,一些著名的代码就是这样完成的。
我更喜欢为每个平台使用不同的 .h/.cpp,以及一些用于所有平台的通用代码的 .cpp。
.h 标头应包括通用对象/函数,并包括(通过#ifdefs)特定平台标头(仅具有该平台的对象/功能)。
使用这种方法,您需要为每个平台使用不同的配置/makefile/任何构建文件。
推荐阅读
- javascript - 在 Javascript 构造函数中处理项目
- amazon-web-services - 将 S3 存储桶网站仅限于某些 AWS 账户
- node.js - face-api.js 从磁盘加载图像文件
- javascript - Firefox:以编程方式触发自动滚动
- c - 二分查找(递归实现)
- java - 奥利奥后通知背景颜色
- java - 具有接口的多态性和具有抽象类的多态性一样合法吗?
- sql - 运输报告 - 具有两个日期的不同订单 - 表中缺少状态 THEN
- corda - Corda 项目中包含的 2 个 build.gradle 文件有什么区别
- reactjs - 点击打开 react-360 视图