C/C++中關鍵字extern詳解

1.extern功能詳解

1.extern功能詳解

C/C++中關鍵字extern不外乎有下面幾個作用,只要記住了這幾個規則就可以在項目中運用自如。
① 擴展外部變量的作用域(在同一個文件範圍內)
② 將外部變量的作用域擴展到其他文件
③ 將外部函數(函數名前面沒有加static關鍵字)的作用域擴展到其他文件

現在來對上面列舉的3個功能做詳細的講解:
我們知道,在用C/C++進行編程時候,所以的變量或函數都必須先定義,再使用(一些腳本語言如:shell、python等除外)。若使用了一個未定義的變量或函數,在編譯時編譯器就會報錯,並提示該變量或函數未定義,操作、使用非法的變量/函數。而且定義的變量、函數還會涉及到一個很重要的概念:作用域。作用域的概念其實很簡單,不要把它想得太複雜。就拿生活中的河裏的魚來舉例,魚只能生活在水裏,脫離了水後魚便會因爲缺氧而亡。因此這條河就是魚生活的活動範圍,生存區間。也就是說魚的作用域便在這條河的範圍內。同樣,代碼中的變量和函數也有自己的範圍區間,若在超過了這個區間的其他地方使用則無效,報錯。

1.1 擴展外部變量的作用域(在同一個文件範圍內)

代碼 1

/*************************************************************************
 * File Name: sum.cpp
 * Author:    The answer
 * Function:  Other        
 * Mail:      [email protected] 
 * Created Time: 2018年05月10日 星期四 00時14分19秒
 ************************************************************************/
#include<iostream>
using namespace std;
int SumFunc(int,int);   //函數聲明
int main(int argc,char **argv)
{
    extern int Sum;     //extern                                                                                                                                                   
    Sum = SumFunc(66,88);
    cout<<"Sum: "<<Sum<<endl;
    return 0;
}
int Sum = 0;
int SumFunc(int a,int b)
{
    Sum = a+b;
    return Sum;
}

執行結果:Sum: 154
該文件中,變量 Sum 定義到了main函數的外面,因此Sum變量的作用域對於main而言是不可見的,該變量Sum的作用域爲從定義處開始一直到本文件結束。但是現在我們需要在main函數中使用該變量,因此需要用到 extern 關鍵字來進行聲明、擴展外部變量Sum 的作用域,使其在main函數內部也可見。
這裏有 5 個地方值得注意:
(1). 必須對函數SumFunc進行聲明。聲明的作用是:把函數名、函數參數個數、參數類型和函數的返回值告知編譯系統,以便用到函數的調用時,編譯器能夠正確的識別並檢查其調用方法是否合法、正確。(注意:在聲明時,函數的參數可以不寫參數名字,只寫類型就可以了)

(2)在聲明 extern int Sum;的時候,不要對 extern int Sum;進行賦值,如: extern int Sum = 10;這是錯誤的。
(3)外部變量(普通全局變量)只能夠定義一次,但是可以聲明多次。如上面的extern int Sum;聲明.寫成這樣也不會報錯:
extern int Sum;
extern int Sum;
extern int Sum;
extern int Sum;
這裏聲明瞭 4 次,也能夠編譯通過。

(4)extern只能聲明外部變量(普通全局變量),是配合全局變量使用。
(5)全局變量定義時候初始化爲0(爲了直觀,即使不初始化也爲0);而聲明全局變量時候,加上extern關鍵字。


1.2 將外部變量的作用域擴展到其他文件

代碼 2
這裏寫圖片描述

在C/C++中,一個程序可以由一個或多個源程序文件組成。若是隻有一個文件,使用方法 就可以解決問題。但是若有一個或多個源文件組成,而剛好此時一個文件中需要使用另外文件中的變量,那麼就得使用到 extern 關鍵字來進行聲明,告知編譯器,該變量是有定義的,在其他源文件的某個地方。

上面的代碼2中,該程序由 2 個源文件組成,其中 main.c 是程序運行的主函數,而 Global.c 中定義了全局變量 int A = 10; 現在主程序main.c中需要用到這個 A 變量,所以在使用該變量A時,得先對其進行聲明。(在沒有聲明的情況下,直接使用時候,會報錯)。

至於該int A變量的聲明放在哪裏,這個無所謂,都可以。只有在引用之前聲明都行。如下圖:
這裏寫圖片描述

重點:在編譯的時候,需要把Global.c也加入進去一起進行編譯。如:gcc main.c Global.c -o app 或直接使用Makefile都可。

該程序運行結果:A[10]


1.3 將外部函數(函數名前面沒有加static關鍵字)的作用域擴展到其他文件

代碼 3
這裏寫圖片描述

複用代碼 (2),現在在Global.c中多加了一個Add()函數,用來求和的。該函數的作用域爲在Global.c 的整個文件訪問內有效,但是對於main.c 是不可見的。若在main.c中來使用該函數,通用得使用 extern 來進行聲明。這樣就可以在main.c中來使用該函數了。編譯方式同代碼 2 相同。

執行結果:
A[10]
Sum[30]





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章