C++中的跨平台兼容性

Cross platform compatibility in C++

本文关键字:兼容性 跨平台 C++      更新时间:2023-10-16

我有一个Arduino微控制器,它通过串行端口将数据发送到HC-05蓝牙模块。由于连接到通信端口的实现是特定于操作系统的,因此包含文件将有所不同。有没有比#ifdef _WIN32更好的方法来构建代码
我目前使用的操作系统是Windows 10。

#ifdef _WIN32
#include <io.h>
#else
#include <unistd.h>
#include <termios.h>
#endif
ArduinoDevice::ArduinoDevice(const char *dev)
{
    device = dev;
    fp = NULL;
    started = false;
    iostarted = false;
}
void ArduinoDevice::connect()
{
    #ifdef _WIN32
      //windows code
    #else 
      //mac code
    #endif
}

您可以使用单个中性头文件(例如ArduinoDevice.h)和更多特定于平台的源文件,每个支持的平台都有一个扩展名,例如*.win32.cpp、*.posix.cpp(例如AruinoDevice.win32.cpp,ArduinoDevices.posix.cpp等)。

在每个操作系统上,您将只编译具有相关扩展名的源文件,而不需要更改调用代码。条件代码(#ifdef#endif块)不是必需的,可以在项目构建配置中处理使用一个或另一个文件进行编译。

考虑让应用程序逻辑调用一个抽象硬件知识的库。

定义

  1. 提供所需功能(打开、关闭、读取、写入等)的标头(bluetooth.h或类似),可能捆绑在一个类中
  2. 每个平台都有不同的CPP文件(winBluetooth.CPP、macBluetooth.chpp等)
  3. 可能是一个CPP文件,它充满了减少代码重复的通用功能

每个特定于平台的CPP文件都包含正确的标头,并使用实现标头中的函数所需的特定于平台调用。这消除了对条件编译的需求,并通过将问题从代码推送到构建系统来管理谁需要更具条件编译的标头。

构建程序可能会变得有点棘手,但任何值得使用的开发环境都允许您定义不同的目标、构建目标所需的工具链,以及目标的构建中包括哪些文件。在过去,这会在makefile中产生一些额外的规则。在您的系统上执行的方式因系统而异。