同一份 C 代碼在 Visual C++ 6.0 (VC6)、Code::Blocks (MinGW/GCC)、Visual Studio 2015+ (MSVC) 上編譯運行結果不同,甚至有的能編通、有的報錯。典型案例:
for (int i = 1; i < 2; i++);
for (int i = 1; i < 2; i++); // 同一作用域內重複定義變量 i
VC6 編譯通過,GCC 報錯 redeclaration of 'i'。
| 編譯器 | 核心標準支持 | 特點 |
|---|---|---|
| VC6 (1998) | C89/C90 為主,部分 C99 | 極其老舊,不支持 for 循環變量作用域限制在循環內(C99 特性),變量泄露到外層作用域,故允許重複定義。 |
| MSVC (VS2013+) | C90 完整,C99 部分,C11/C17 極少 | 微軟長期專注 C++,C 標準更新緩慢;但近年 VS2019/2022 大幅改進 C11/17 支持。 |
| GCC (MinGW/Linux) | C99 完整,C11/C17 基本完整 | 緊跟標準,嚴格執行作用域規則,報錯更準確。 |
| Clang | C11/C17 完整 | 診斷信息最友好,現代項目首選。 |
for (int i=0; ...) 合法。int n; scanf("%d",&n); int arr[n];malloc 替代。// 單行註釋long long / %lld 格式化%I64d,GCC/Clang 用 %lld,跨平台需用 inttypes.h 的 PRId64。strdup、asprintf、strtok_r 等 POSIX 函數 Windows 無,需自行實現或用 _strdup 等替代。scanf_s、printf_s 為 MSVC 安全版本,非標準,跨平台代碼應避免或用宏封裝。-std=c11 -Wall -Wextra -pedantic (GCC/Clang) 和 /std:c11 /W4 (MSVC)。高校仍用 VC6 教學是歷史包袱。建議:
i = i++ 此類代碼。編譯器不一致 本質是 C 標準支持程度差異。現代開發應以 C11/C17 標準為基線,使用 GCC/Clang/MSVC 多編譯器驗證,拒絕依賴特定編譯器擴展,才能寫出真正可移植、健壯的 C 代碼。