硬件平台差異(指令集、字節序)通常由編譯器屏蔽;軟件平台差異(Windows vs Linux/Unix API)才是我們面對的核心挑戰。Qt 的價值在於替我們吞噬了 90% 的平台差異——QMainWindow::show() 底層自動映射到 Win32 API 或 X11/Wayland/KDE/GNOME API。
當必須調用系統命令(Windows dir / Linux ls)、處理文件路徑分隔符、編碼轉換時,需引入預處理隔離:
void MainWindow::openProcess() {
#if defined(Q_OS_WIN32)
p->start("cmd.exe", QStringList() << "/c" << "dir");
#elif defined(Q_OS_LINUX)
p->start("ls", QStringList() << "/home/usr_name");
#endif
connect(p, SIGNAL(finished(int)), this, SLOT(readResult(int)));
}
void MainWindow::readResult(int exitCode) {
if (exitCode == 0) {
#if defined(Q_OS_WIN32)
QTextCodec *gbkCodec = QTextCodec::codecForName("GBK");
QString result = gbkCodec->toUnicode(p->readAll());
#elif defined(Q_OS_LINUX)
QTextCodec *utfCodec = QTextCodec::codecForName("UTF-8");
QString result = utfCodec->toUnicode(p->readAll());
#endif
QMessageBox::information(this, "dir", result);
}
}
Qt 內建宏 Q_OS_WIN32、Q_OS_LINUX、Q_OS_MAC 等,編譯期決議,零運行開銷。
QDir/QFile/QFileInfo 替代系統調用,QStandardPaths 替代硬編碼路徑。QString(UTF-16),僅在邊界(文件、網絡、系統調用)按平台慣例轉碼(Windows GBK/CP936,Linux UTF-8)。| 場景 | Windows | Linux/Unix | Qt 統一做法 |
|---|---|---|---|
| 路徑分隔符 | \ | / | QDir::toNativeSeparators() / QDir::separator() |
| 換行符 | \r\n | \n | QTextStream 自動處理 / QString::split('\n') |
| 動態庫後綴 | .dll | .so | QLibrary / QPluginLoader 自動解析 |
| 大小寫敏感 | 不敏感 | 敏感 | 代碼中統一嚴格大小寫 |
| 控制台編碼 | GBK/CP936 | UTF-8 | 啟動時 QTextCodec::setCodecForLocale() |
跨平台不是「寫一次到處跑」的魔法,而是紀律性地將平台差異封裝在邊界層。Qt 已經幫我們完成了大部分繁重工作,剩下的只是:業務邏輯純 C++/Qt,平台專屬代碼最小化、#ifdef 集中化、編碼邊界顯式化。堅持這些原則,代碼庫即可在 Windows/Linux/macOS/嵌入式 Linux 間平滑流轉。