1. 程式人生 > >extern實現原始檔(標頭檔案)之間變數和函式的引用

extern實現原始檔(標頭檔案)之間變數和函式的引用

在一個C工程中,會有很多原始檔,因此當在一個原始檔中呼叫另一個原始檔中的函式或者使用另一個原始檔中定義的變數和結構體時,如何保證函式和變數的可見性呢?

1.結構體和變數的呼叫

下面是看到的關於結構體中的使用:http://blog.csdn.net/Fortware/article/details/44208309?locationNum=10

總結下來就是:包含標頭檔案之後,定義的結構體變數必須用extern宣告。

//比如在b.c中想使用a.h中的結構體,步驟如下:

#include “a.h”  //  1.包含需要的標頭檔案

struct test c;    //   2.先定義一個結構體變數(定義,不是宣告)
extern struct test c;   //  3.宣告要呼叫的結構體變數是全域性的外部變數
int main(){
//  4.接下來就可以對結構體變數c進行賦值了
c.a = 1;
c.b = 2;
}




2.函式的呼叫

函式宣告方法時,可用extern宣告,也可省略extern,

a.c檔案中:   
    double squ(double x)   
    {  
        return x*x;  
    }  

b.c檔案中:  
    #include<stdio.h>  
    extern double squ(double x); //這裡不加extern執行也沒有問題,一般還是加上  
   
    int main()  
    {  
        printf("%f",squ(3.0));  
        return 0;   
    }  


為什麼方法可以不加extern而變數必須加呢?原因如下:

函式宣告主要是給連結器一個明確的hint,從而在匹配函式名字以後還能檢查一下型別是否正確。至於extern關鍵字,對於函式宣告本身是無所謂的,反正末尾一個分號編譯器就懂了,能識別出來這是個宣告而不是定義;只是對於變數的宣告,沒它就不行。

C標準裡是怎麼要求的我不確定,不過建議是,對於本檔案的函式不加extern,外部檔案的加上,這樣可以給讀原始碼的人一個hint。一般來說,宣告都是放在標頭檔案裡的,這樣你不用在所有用到它的 .c 檔案裡都寫上一大堆宣告,而只需要引入一個頭檔案,也避免宣告得和實現不一致(標頭檔案通常和實現一起分發的)。