C/C++中全局變量的那些事兒


  C/C++中的變量分為全局變量、靜態全局變量、局部變量和靜態局部變量,在《C/C++中靜態局部變量的特點與應用》中我們介紹過靜態局部變量,今天我們的目標是全局變量。

單個文件中的全局變量

  簡單一點說,全局變量就是在函數外面定義的變量,下面是一個最簡單的實例,一共定義了兩個int型的全局變量a和b,這兩個全局變量定義的位置不大相同,a定義在函數fun1之前,而b定義在之后,a和b都定義在函數main之前,從使用情況看全局變量a可以在其后面的所有函數中使用,而全局變量b只能在函數main中使用,不能在其定義之前的函數fun1中使用。因此,我們可以得出這樣的結論:全局變量的作用域為其定義位置開始,至文件結尾,也即只有文件作用域

C++語言知蟻博客

#include “stdio.h”

int a = 1;    //這就是個全局變量啦

void fun1() //這個函數只能使用全局變量a,不能用b
{
    a++;
    printf(“a=%d\n,a);
}

int b = 2//這也是個全局變量

void main() //這里a b都可以用
{
    fun1();
    a++;
    printf(“a=%d,b=%d\n,a,b);
    getchar();
}

讓全局變量在多個文件中有效

  前面講過,全局變量的作用域起始於定義的地方直到文件結尾,那豈不是就沒法在其他文件中使用了啊。從C/C++現在NB的程度上看,這個事情是不可能的,要是這樣那還了得。為了使全局變量的作用域擴大到多個文件中,C++中提供了extern關鍵字。

  下面實例代碼中的extern int g_c;是做一個聲明,說這個變量g_c是一個全局變量啊,你們隨便用,g_c本身在其他文件中定義(在本文件中定義也可以,不過要保證其他文件中沒有定義過),這樣就將全局變量的作用域擴大到多個文件了。

  全局變量只要在一個文件中定義后,在其他需要使用的源文件中只要使用extern關鍵字,即可在該文件中使用,概括下就是:extern擴展全局變量的作用域

C++語言知蟻博客

#include “stdio.h”

extern int g_c//聲明這是一個外部全局變量

int g_a = 1;    //全局變量

void fun1()
{
    g_a++;
    printf(“g_a=%d,g_c=%d\n,g_a,g_c);
}

int g_b = 2//全局變量

void main()
{
    fun1();
    g_a++;
    printf(“g_a=%d,g_b=%d,g_c=%d\n,g_a,g_b,g_c); //這里直接就用上g_c了
    getchar();
}

  上做了一點小小的更改,把所有的全局變量全部加上g_前綴,用以表示這是一個全局變量。

限制全局變量只能在一個文件中有效

  剛才好不容易才把全局變量的作用域擴展到多個文件了,干嘛現在又要限制呢?這是因為雖然全局變量定義后不使用extern關鍵字的話只能在本文件中使用,但是如果你在其他文件中定義同樣名字的全局變量的話,那是不允許滴(在鏈接的時候會出錯),至於詳細原因以后再說。

  為了能夠實現在不同的文件中使用相同名字的全局變量,static關鍵字就派上用場了,在C/C++中靜態局部變量的特點與應用中我們已經說過static關鍵字了,用static修飾的局部變量只能在定義變量的函數中使用,那么用static修飾的全局變量也就只能在定義其的文件中使用了,這就是傳說中的靜態全局變量。

C++語言知蟻博客
#include “stdio.h”

extern int g_c//其他文件中定義的全局變量

static int g_a = 1;    //靜態全局變量 限本文件中使用

void fun1()
{
    g_a++;
    printf(“g_a=%d,g_c=%d\n,g_a,g_c);
}

int g_b = 2//全局變量

void main()
{
    fun1();
    g_a++;
    printf(“g_a=%d,g_b=%d,g_c=%d\n,g_a,g_b,g_c);
    getchar();
}

  通過static修飾后,我們就可以在不同的文件中使用相同名字的全局變量而不會出現鏈接錯誤了。

 


原創文章請注明轉載於知蟻博客,本文地址:http://www.letuknowit.com/archives/87


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM