C 語言中,標識符的屬性完全由聲明決定:
int func(void); → func 是函數地址,後續使用即調用。int a[2]; → a 是數組首地址(常量指針),不可修改指向。int *p; → p 是指針變量,可修改指向。核心認知:聲明不僅是語法要求,更是賦予標識符「身份」的契約。
goto label; 目標,僅是一段順序執行的指令集合,無參數、無返回、無棧幀隔離。錯誤示例:
void bad() {
printf("hello"); // 執行語句
int i; // 其後聲明變量 → 警告
}
正確寫法(C89/C90 強制):
void good() {
int i; // 所有聲明前置
char buf[128];
printf("hello"); // 執行語句
}
現代編譯器(GCC ≥ 3.4、MSVC、Clang)默認支援 C99 混合聲明,可用 -std=c99 或 -std=gnu99 顯式啟用;嚴格遵循 C89 時必須前置聲明。
對比 C++/Java 的 public/private/protected,C 僅提供 static 一種作用域控制:
static 修飾全局變量/函數 → 內部鏈接,僅本編譯單元可見。static 修飾局部變量 → 靜態存儲期,函數調用間保持值。無類封裝機制,靠文件劃分模組、靜態隱藏實現細節。
static 變量、字符串字面量。static 的全局變量具有外部鏈接,多文件可 extern 共享;加 static 後限制為內部鏈接。static 限制符號可見範圍,減少耦合。static 同時影響兩者。