首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言基礎

C語言函數聲明與函數原型:解決前向引用的關鍵機制

     編輯:C 語言基礎

為什麼需要函數聲明?

C 語言自上而下編譯,原則上函數定義必須出現在調用之前。但實際開發中:

  • 主邏輯在 main,輔助函數在後定義更符合閱讀習慣
  • 多文件編程時,函數定義在其他 .c 文件
  • 庫函數定義在預編譯庫中,不可見

函數聲明告訴編譯器:「這個函數存在,這是它的接口信息,請先信任我,定義稍後補上」。

函數聲明語法

返回類型 函數名(參數類型列表);
  • 等價於去掉函數體、加上分號
  • 參數名可省略,只保留類型:long factorial(int);
  • 聲明提供的接口信息稱為函數原型

函數原型的作用

  1. 告知編譯器函數存在、返回類型、參數類型/個數
  2. 調用時進行類型檢查(參數隱式轉換、返回值接收)
  3. 允許函數定義出現在調用之後、其他文件、靜態/動態庫中

實戰示例:階乘累加(函數定義後置)

#include <stdio.h>

// 函數聲明(原型)
long factorial(int n);  // 也可寫 long factorial(int);
long sum(long n);

int main() {
    printf("1!+2!+...+10! = %ld\n", sum(10));
    return 0;
}

// 定義在 main 之後
long factorial(int n) {
    long result = 1;
    for (int i = 1; i <= n; i++) result *= i;
    return result;
}

long sum(long n) {
    long result = 0;
    for (int i = 1; i <= n; i++) result += factorial(i);  // 嵌套調用
    return result;
}

運行結果

1!+2!+...+10! = 4037913

頭文件的本質:函數聲明的集合

許多初學者誤以為 #include <stdio.h> 引入了函數定義(函數體)。錯誤!

  • 頭文件(.h)只包含函數聲明、宏定義、類型定義
  • 函數定義(函數體)在系統庫中(.lib/.a/.so/.dll)
  • 編譯階段用頭文件做類型檢查,鏈接階段從庫中解析符號地址
  • 只有頭文件無庫 → 編譯通過,鏈接失敗(undefined reference)

聲明 vs 定義對照表

變量也有聲明與定義之分

int a;           // 定義(分配內存)
extern int a;    // 聲明(不分配,引用他處定義)
extern int a = 10; // 帶初始化的 extern 是定義

詳細機制見《從 extern 關鍵字開始談 C 語言多文件編程》。

實用技巧:查閱函數原型

不確定如何使用某庫函數時,查原型而非定義。推薦權威參考:

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
項目聲明定義
關鍵字無特定關鍵字(外部聲明可加 extern)函數體 { }
次數可多次(同作用域內需一致)全程序僅一次
分配內存否是(代碼段)
目的告知接口實現功能