遵循标准C++规范
编写符合C++标准(如C++11及以上)的代码,优先使用标准库(如<iostream>、<vector>、<string>、<filesystem>)替代平台特定API(如避免直接调用Windows API或Linux系统调用)。标准库在不同平台上的行为一致,能有效减少跨平台问题。例如,用std::vector代替原生数组,用std::filesystem处理文件路径,而非<direct.h>(Windows)或<unistd.h>(Linux)。
使用预处理器宏处理平台差异
通过#ifdef、#elif、#endif等预处理指令,根据平台定义隔离平台特定代码。常见宏包括_WIN32(Windows)、__linux__(Linux)、__APPLE__(macOS)。例如:
#ifdef _WIN32
#include <windows.h>
Sleep(1000); // Windows休眠1秒
#elif defined(__linux__) || defined(__APPLE__)
#include <unistd.h>
sleep(1); // Linux/macOS休眠1秒
#endif
这种方式能清晰区分不同平台的代码逻辑,避免编译错误。
采用跨平台第三方库
选择经过跨平台验证的第三方库,简化开发流程。常用库包括:
boost::filesystem替代原生文件操作);使用CMake进行构建管理
CMake是跨平台构建系统生成器,能根据平台自动生成Makefile(Linux)、Visual Studio项目(Windows)等。编写CMakeLists.txt文件描述项目结构,例如:
cmake_minimum_required(VERSION 3.10)
project(MyCrossPlatformProject)
set(CMAKE_CXX_STANDARD 17) # 设置C++标准
add_executable(MyApp src/main.cpp src/utils.cpp) # 添加可执行文件
target_link_libraries(MyApp PRIVATE pthread) # 链接线程库(Linux需要)
通过cmake ..生成构建文件,再用make编译,实现“一次编写,到处编译”。
处理文件路径与系统调用
std::filesystem(C++17及以上)处理路径分隔符(Windows用\,Linux用/),例如:#include <filesystem>
namespace fs = std::filesystem;
fs::path filePath = "data/config.txt"; // 跨平台路径表示
if (fs::exists(filePath)) { /* 文件存在 */ }
std::thread替代平台API)、文件操作(std::fstream替代fopen)。测试与持续集成
.github/workflows/ci.yml可添加Linux构建任务:jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install dependencies
run: sudo apt-get install -y build-essential cmake
- name: Build project
run: mkdir build && cd build && cmake .. && make
确保代码变更后及时发现跨平台问题。