程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> C語言函數的聲明以及函數原型

C語言函數的聲明以及函數原型

編輯:C語言基礎知識
C語言代碼由上到下依次執行,原則上函數定義要出現在函數調用之前,否則就會報錯。但在實際開發中,經常會在函數定義之前使用它們,這個時候就需要提前聲明。

所謂聲明(Declaration),就是告訴編譯器我要使用這個函數,你現在沒有找到它的定義不要緊,請不要報錯,稍後我會把定義補上。

函數聲明的格式非常簡單,相當於去掉函數定義中的函數體再加上分號;,如下所示:

返回值類型  函數名( 類型 形參, 類型 形參… );

也可以不寫形參,只寫數據類型:

返回值類型  函數名( 類型, 類型…);

函數聲明給出了函數名、返回值類型、參數列表(參數類型)等與該函數有關的信息,稱為函數原型(Function Prototype)。

函數原型的作用是告訴編譯器與該函數有關的信息,讓編譯器知道函數的存在,以及存在的形式,即使函數暫時沒有定義,編譯器也知道如何使用它。

有了函數聲明,函數定義就可以出現在任何地方了,甚至是其他文件、靜態鏈接庫、動態鏈接庫等。

上節給出了計算sum = 1! + 2! + 3! + ... + (n-1)! + n!的代碼,這節我們稍作修改,將 factorial() 和 sum() 函數的定義放到 main() 函數後面,請看下面的代碼:
#include <stdio.h>

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

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

//求階乘
long factorial(int n){
    int i;
    long result=1;
    for(i=1; i<=n; i++){
        result *= i;
    }
    return result;
}

// 求累加的和
long sum(long n){
    int i;
    long result = 0;
    for(i=1; i<=n; i++){
        //嵌套調用
        result += factorial(i);
    }
    return result;
}
運行結果:
1!+2!+...+9!+10! = 4037913

我們知道,使用 printf()、puts()、scanf()、getchar() 等函數要引入 stdio.h 這個頭文件,很多初學者認為 stdio.h 中包含了函數定義(也就是函數體),只要有了頭文件程序就能運行。其實不然,頭文件中包含的都是函數聲明,而不是函數定義,函數定義都在系統庫中,只有頭文件沒有系統庫在鏈接時就會報錯,程序根本不能運行。

關於系統庫以及編譯鏈接的原理,我們將在《C語言模塊化開發》專題中詳細講解。

除了函數,變量也有定義和聲明之分,我們將在《從extern關鍵字開始談C語言多文件編程》一節中深入討論。

最後再補充一點,函數原型給出了使用該函數的所有細節,當我們不知道如何使用某個函數時,需要查找的是它的原型,而不是它的定義,我們往往不關心它的實現。

www.cplusplus.com 是一個非常給力的網站,它提供了所有C語言標准函數的原型,並給出了詳細的介紹和使用示例,可以作為一部權威的參考手冊。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved