C++中的跨平台兼容性
Cross platform compatibility in C++
我有一个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块)不是必需的,可以在项目构建配置中处理使用一个或另一个文件进行编译。
考虑让应用程序逻辑调用一个抽象硬件知识的库。
定义
- 提供所需功能(打开、关闭、读取、写入等)的标头(bluetooth.h或类似),可能捆绑在一个类中
- 每个平台都有不同的CPP文件(winBluetooth.CPP、macBluetooth.chpp等)
- 可能是一个CPP文件,它充满了减少代码重复的通用功能
每个特定于平台的CPP文件都包含正确的标头,并使用实现标头中的函数所需的特定于平台调用。这消除了对条件编译的需求,并通过将问题从代码推送到构建系统来管理谁需要更具条件编译的标头。
构建程序可能会变得有点棘手,但任何值得使用的开发环境都允许您定义不同的目标、构建目标所需的工具链,以及目标的构建中包括哪些文件。在过去,这会在makefile中产生一些额外的规则。在您的系统上执行的方式因系统而异。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 通过网络、跨平台传递std::变体是否安全
- 如何跨平台将二进制资源构建到程序中?
- 提升序列化 1:73 的向后兼容性问题
- 以跨平台的方式将图像源路径从C++发送到 QML
- 跨平台 GPU 计算
- 在gcc中意外调用了Const重载.编译器错误或兼容性修复程序
- 各种版本的 Mac OSX 向后兼容性如何?(Xcode C++
- Visual Studio 19-17 库兼容性根据 GL 标志
- 在哪里存储跨平台C++应用存储?
- 如何将外部依赖引入跨平台CMake项目?
- C++ ABI 兼容性问题/张量流
- 将 VS Code 用于跨平台可缩放C++项目
- 创建跨平台 C++ 触摸管理器.在 c++ 中传递 Objective-c 对象涉及代码
- 使用通配符的跨平台文件列表
- Oracle OCCI 和 g++ 7.1 的兼容性问题
- 我对COM和跨平台兼容性感到困惑
- C++中的跨平台兼容性
- Std:ostream和跨平台兼容性
- C/ c++的跨平台兼容性(从Java移植项目)