在單一 .c 文件中,函數 A 調用函數 B 時:
#include
/* 前置聲明:告訴編譯器 func_behind 存在、無參、無返回 */
void func_behind(void);
void func_before(void) {
printf("\n @@: before function call!!! \n\n");
}
int main(int argc, char **argv) {
func_behind(); // 後置調用:依賴上方聲明
func_before(); // 前置調用:定義已在上方
return 0;
}
/* 定義在 main 之後 */
void func_behind(void) {
printf("\n @@: behind function call!!! \n");
}
void func_behind(void); → 記錄符號表:func_behind 為函數,無參,返回 void。func_behind(); → 查表匹配,生成調用指令。func_before() 定義 → 記錄符號,生成函數體代碼。func_behind() 定義 → 與前序聲明核對一致,生成函數體代碼。static,放在文件末尾或開頭均可,無需外部聲明。/* 錯誤:缺少聲明 */
int main() { foo(1.5); } // 警告/錯誤:隱式聲明 foo 返回 int,實際傳 double
void foo(double x) { ... } // 定義不匹配,行為未定義
/* 正確:前置聲明 */
void foo(double);
int main() { foo(1.5); }
void foo(double x) { ... }
C 語言單文件編譯時,函數後置調用必須前置聲明。這不僅是語法要求,更是類型檢查、模塊化設計的基石。良好習慣:所有非 static 函數在 .h 中聲明,.c 開頭包含 .h,定義順序隨意,讓編譯器保證一致性。