歷史地位:經典不等於過時
VC6 (1998) 雖不支援 C++98 完整標準(無部分模板特化、無標準庫命名空間 `std` 完整實作),但因輕量、啟動快、專案格式簡單(`.dsp`/`.dsw`)、大量存量專案仍在維護,至今仍活躍於嵌入式、舊系統維護、教學實驗室。理解其架構有助於遷移至現代 VS/MSBuild/CMake 體系。
VC6 元件架構
- MSVC 6.0 編譯器 (cl.exe):前端解析、後端代碼生成,支援部分 C++98、大量 Microsoft 擴充 (`__declspec`、`__fastcall`、MFC/ATL 專屬屬性)。
- 連結器 (link.exe):COFF 格式,支援增量連結、DLL 匯出/導入庫生成、延遲載入。
- IDE (msdev.exe):工作區/專案管理、資源編輯器 (對話框/選單/圖示)、ClassWizard (MFC 訊息映射/虛函數覆寫自動生成)、原始碼瀏覽器、整合除錯器。
- MFC 4.2 / ATL 3.0:封裝 Win32 API 的 C++ 類庫,提供文檔/視圖架構、ActiveX/COM 支援。
建置流程詳解
- 預處理:展開 `#include`、`#define`、條件編譯,產生 `.i` 中間檔 (可用 `/P` 參數輸出)。
- 編譯:語法分析、語義分析、優化、生成組合語言,再由組譯器產生 `.obj` (COFF 目標檔)。
- 連結:解析符號引用、合併區段、修正重定位、生成 `.exe` 或 `.dll` (PE 格式),同時產生 `.lib` 導入庫供其他專案連結。
專案結構與關鍵檔案
MyProject/
├── MyProject.dsw # 工作區檔 (文本,可手工編輯)
├── MyProject.dsp # 專案檔 (文本,記錄來源檔、設定、相依)
├── Src/
│ ├── StdAfx.h/.cpp # 預編譯標頭 (PCH),加速建置關鍵
│ ├── MyProject.h/.cpp
│ └── Resource.h # 資源 ID 定義
├── Res/
│ └── MyProject.rc # 資源腳本 (對話框、字串表、版本資訊)
└── Debug/Release/ # 輸出目錄
遷移現代化建議
- 專案格式轉換:VS 2010+ 可直接開啟 `.dsp` 自動轉 `.vcxproj` (MSBuild),但需手動修正:
• 移除 VC6 專屬編譯選項 (`/GX` → `/EHsc`、`/ML` → `/MT` 等)
• 補上 `std::` 命名空間、標準庫頭檔 (`` → ``)
• 修正 MFC/ATL 版本差異 (VC6 MFC 4.2 → VS2022 MFC 14.x)
- 建置系統現代化:引入 CMake (`cmake_minimum_required 3.20`),產生跨平台專案,支援 Ninja、VS、Xcode、Qt Creator 等所有 IDE。
- 編譯器升級:MSVC 19.3x (VS2022) 完整支援 C++20、部分 C++23,啟用 `/std:c++20 /permissive- /Zc:__cplusplus` 獲得標準相容性。
- 靜態分析:開啟 `/analyze` (PREfast) 或整合 Clang-Tidy、Cppcheck,捕捉 VC6 時代忽略的 UB、資源洩漏、並發缺陷。
結語
VC6 是一代 C++ 開發者的啟蒙工具,但現代 C++ 開發已進入「標準化、模組化、靜態分析、跨平台」新紀元。理解 VC6 架構與建置流程,是為了更優雅地將存量資產遷移至現代工具鏈,而非停留在懷舊中。