C ++中的跨平台兼容性

时间:2016-04-18 20:00:31

标签: c++ bluetooth serial-port

我有一个Arduino微控制器,通过串口将数据发送到HC-05蓝牙模块。由于连接到通信端口的实现是特定于OS的,因此包含文件将是不同的。是否有更好的方法来构建代码而不是#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
}

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

定义

  1. 提供所需功能(打开,关闭,读取,写入等...)的标题(bluetooth.h或类似标题),可能捆绑在一个类中
  2. 每个平台的不同CPP文件(winBluetooth.cpp,macBluetooth.cpp等)
  3. 可能是一个CPP文件,其中包含减少代码重复的常用功能。
  4. 每个特定于平台的CPP文件都包含正确的标头,并使用实现标头中的功能所需的特定于平台的调用。通过将问题从代码推送到构建系统,这消除了对条件编译和管理谁需要更多条件编译的头文件的需要。

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