Visual C++ 6.0 (1998) 是Windows 桌面開發黃金時代的標志性產品,雖已停止支持 15+ 年,但大量存量代碼庫仍基於此。核心組件:
std::string 完整實現、iostream 非標準)、for 循環變量作用域錯誤。CObject 體系。CComPtr, CComObject 等。
源文件 (.cpp/.c)
│
▼
預處理器 (cl.exe /E) ──► .i 文件
│
▼
編譯器前端 (cl.exe /c) ──► .obj (COFF 格式)
│ │
│ └─ 優化選項:/O2 (速度) /O1 (大小) /Og /Oi /Ot
│
▼
資源編譯器 (rc.exe) ──► .res
│
▼
鏈接器 (link.exe) ──► .exe / .dll
│ │
│ └─ 關鍵選項:/SUBSYSTEM:WINDOWS|CONSOLE
│ /ENTRY:mainCRTStartup|WinMainCRTStartup
│ /DEBUG /PDB:xxx.pdb /OPT:REF /OPT:ICF
│
▼
可執行文件 (PE 格式)
| 問題 | VC6 行為 | 現代標準 (VS2022) | 修正策略 |
|---|---|---|---|
for(int i=0;...) { } i=5; | i 作用域延伸到外層 | i 僅循環內可見 | 重命名外層變量,或用 { for(...) } 顯式作用域 |
| 標準庫缺失/非標準 | stlport 或自帶舊版 | 完整 C++20 STL | 全局替換命名空間,審查 hash_map→unordered_map |
| MFC 消息映射宏 | BEGIN_MESSAGE_MAP 等 | 同宏但消息參數類型變化 | 批量遷移工具 vcxproj 升級向導 + 手動修正 |
| ATL COM 支持 | CComModule 單例 | CAtlExeModuleT / CAtlDllModuleT | 模塊類重構,註冊腳本 .rgs 遷移 |
| 字符集 | 默認 MBCS | 默認 Unicode | 項目屬性 → 字符集 → Unicode,TCHAR 宏自動切換 |
| 運行時庫 | MSVCRT.dll (系統組件) | VC Runtime (VCRUNTIME140.dll 等) | /MD 動態鏈接,安裝 VC++ Redistributable |
/W4 /WX,逐個修復 (VC6 忽略大量現代警告)。/RTC1 (調試) 捕獲未初始化變量、棧損壞。/analyze 或 Clang-Tidy 掃描邏輯缺陷。natvis 可視化。perf 風格火焰圖。vcpkg 依賴管理。凍結功能、專注遷移。制定 6-12 個月遷移計劃,分模塊驗證。若項目極其龐大且無重構預算,可考慮VS2022 使用 v140/v141/v142 平台工具集 編譯 VC6 代碼 (兼容性較好),但長期必須現代化——安全補丁、招聘難度、硬件支持 (ARM64) 都在倒逼升級。