1. 程式人生 > >c/c++ extern關鍵字的使用

c/c++ extern關鍵字的使用

extern 關鍵字常用來修飾變數和方法,表示對該變數和方法的宣告及引用。下面用幾個程式碼例項做詳細介紹。

c/c++程式碼中的extern關鍵字

引用同文件中的變數和方法
mian.c

//宣告變數和方法
extern int iCount;
extern void printCount();

int main(){
    iCount = 2;
    printCount();

}

//定義變數
int iCount = 1;

void printCount(){

    printf("iCount=%d\n", iCount);
}

說明:extern關鍵字表示方法和變數在其它地方有定義,此處只是宣告。在此次iCount變數和printCount方法在mian方法後定義和實現。注意此處extern int iCount 和extren void printCount中的extern關鍵字可以去掉,去掉不會報重定義錯誤,但是如果將extern int iCount 改成 extern int iCount = 0,則會報重複定義錯誤。

引用不同檔案中的變數和方法
testExtern.c

//定義變數
int iCount = 1;

//定義方法
void printCount(){

    iCount++;
    printf("iCount=%d\n", iCount);
}

main.c

//宣告變數
extern int iCount ;
//宣告方法
extern void printCount();

int main(){

    iCount++;
    printCount();

}

說明:在testExtern.c檔案中我們定義了一個變數和一個方法,在main.c檔案中我們可以通過extern關鍵字,表示變數和方法在其他地方定義和實現,在該檔案只是一個宣告和使用。注意:一個變數只能是全域性變數才能被其它地方引用。例如本例子如果將testExtern.c中的iCount 變數的定義放到printCount方法內部,則會出現編譯錯誤,找不到該變數。

extern “c”在c/c++混編中的使用

如果一個C語言實現的程式碼模組,要在c++中使用,c語言對應的標頭檔案常用格式如下:

#ifdef  __cplusplus  
extern "C" {  
#endif  


/**** some declaration or so *****/  


#ifdef  __cplusplus  
}  
#endif  /* end of __cplusplus */ 

說明:這是為了讓CPP能夠與C介面而採用的一種語法形式。之所以採用這種方式,是因為兩種語言之間的一些差異所導致的。由於CPP支援多型性,也就是具有相同函式名的函式可以完成不同的功能,CPP通常是通過引數區分具體呼叫的是哪一個函式。在編譯的時候,CPP編譯器會將引數型別和函式名連線在一起,於是在程式編譯成為目標檔案以後,CPP編譯器可以直接根據目標檔案中的符號名將多個目標檔案連線成一個目標檔案或者可執行檔案。但是在C語言中,由於完全沒有多型性的概念,C編譯器在編譯時除了會在函式名前面新增一個下劃線之外,什麼也不會做(至少很多編譯器都是這樣乾的)。
舉例如下:
testExtern.h

#ifndef _TEST_EXTERN_H_
#define _TEST_EXTERN_H_

    //宣告變數
    extern int iCount ;

    //宣告方法
    void printCount(); 

#endif // !_test_Extern_H_

testExtern1.c

#include "testExtern.h"

//定義變數
int iCount = 1;

//定義方法
void printCount(){

    iCount++;
    printf("iCount=%d\n", iCount);
}

testMain.cpp

#include "testExtern.h"

int main(){

    iCount = 10;

    printCount();

    while (1)
    {

    }
}

以上程式碼編譯出錯,找不到printCount方法。錯誤原因就是c++在編譯器編譯c的程式碼的時候,會對名字重新命名,導致連結的時候找不到該方法。

解決辦法1:修改testExtern.h標頭檔案

#ifndef _TEST_EXTERN_H_
#define _TEST_EXTERN_H_

#ifdef __cplusplus
extern "C"{
#endif


    //宣告變數
    extern int iCount ;

    //宣告方法
    void printCount(); 

#ifdef __cplusplus
}
#endif

#endif // !_test_Extern_H_

解決辦法2:修改testMain.cpp中引用標頭檔案的時候指出引用的是.c的標頭檔案

extern "C" {
#include "testExtern.h"
}

int main(){

    iCount = 10;

    printCount();

    while (1)
    {

    }
}

希望對您有所幫助!