代碼 A(編譯通過):
int main(void) {
int i; i = 5;
int j; j = 6;
int a; a = i + j;
printf("a = %d\n", a);
return 0;
}
代碼 B(舊編譯器報錯):
int main(void) {
int i = 5;
int j = 6;
int a = i + j; // 混合聲明與代碼
printf("a = %d\n", a);
return 0;
}
| 標準 | 聲明規則 | 代表編譯器 |
|---|---|---|
| C89/C90 (ANSI C) | **聲明必須在代碼塊開頭**,之後才能跟執行語句 | VC6.0, Turbo C, GCC 默認舊模式 |
| C99 (ISO/IEC 9899:1999) | **允許混合聲明與代碼**,隨用隨聲明 | GCC (默認), Clang, MSVC (VS2013+) |
| C11/C17/C23 | 繼承 C99 規則,進一步增強 | 現代編譯器默認 |
使用 **不支持 C99 的編譯器**(如 VC6.0、或 GCC 加參數 -std=c89 -pedantic)編譯代碼 B 時,編譯器遇到 int i = 5; 後緊跟 int j = 6;(仍屬聲明)尚可接受,但後續若出現執行語句(如賦值、函數調用)再出現聲明 int a = ... 即報錯:「declaration after statement」。
set(CMAKE_C_STANDARD 11),MSVC 專案屬性 → C/C++ → Language → C Language Standard → ISO C11。// 測試代碼
int main() {
int a = 1;
a = 2;
int b = 3; // C99 合法,C89 非法
return 0;
}
編譯命令:gcc test.c -std=c89 -pedantic 若報錯則不支持混合聲明。
理解標準差異,能避免「明明正確代碼卻編譯失敗」的困擾,也是從 C 語言初學者進階為工程師的標誌之一。