int main() {
int a = 10;
int b = 100;
int c = 1;
// 1. int *d = &c; // OK
int *point_1, *point_2;
// 2. int *d = &c; // OK
point_1 = &a;
point_2 = &b;
// 3. int *d = &c; // 編譯錯誤!
printf("*point_1=%d,*point_2=%d\n", *point_1, *point_2);
return 0;
}
C89/C90 標準規定:塊作用域內,所有變量聲明必須出現在任何語句之前。位置 3 在賦值語句 point_1 = &a; 之後,屬於「聲明後語句」,違反規則,編譯器報錯。
| 標準 | 聲明位置規則 | 典型編譯器預設 |
|---|---|---|
| C89/C90 | 聲明必須在語句前 | MSVC (舊版)、GCC -std=c89 |
| C99 | 允許聲明與語句混合 | GCC -std=c99、Clang、MSVC (VS2013+) |
| C11/C17 | 同 C99 | 同上 |
int main() {
int a = 10, b = 100, c = 1;
int *d = &c; // 聲明區
int *point_1, *point_2;
point_1 = &a; // 語句區
point_2 = &b;
printf(...);
}
-std=c99 或 -std=c11C99 或 C11for (int i=0; ...) 需 C99 支援,舊編譯器需外部聲明 int i; for(i=0;...)。位置 3 報錯純屬 C89 聲明前置規則 所致。調整聲明順序或升級編譯標準即可解決。現代項目建議統一使用 C11 標準,享受混合聲明便利。