在不同的編譯單元(不同的cpp檔案)中使用同乙個變數,可以使用extern來修飾,這時候其他的編譯單元(cpp檔案)也可以使用這個變數。
示例**如下:
#pragma once
extern int a;
#include "global.h"
int a =
1;
#pragma once
#include
#include "global.h"
class
a;
#include "a.h"
voida:
:fuc()
voida:
:change()
#include
#include "a.h"
#include "global.h"
using namespace std;
int main()
執行的結果為:
可以發現a.cpp中的a與c.cpp中的a是同乙個a,位址是完全相同的。
但是使用extern修飾全域性變數的時候要注意不要將宣告與定義寫在一起,這樣會導致extern的修飾無效。
extern int a =12;
//這樣等價於 int a = 12;
在某個檔案中定義全域性變數,在其他的檔案中可以使用extern來進行引用。
示例**如下:
#pragma once
int a =
15;
#pragma once
#include
class
class1
;
#include "class1.h"
using namespace std;
extern int a;
void class1:
:fuc()
void class1:
:change()
//主函式
#include
#include "class1.h"
using namespace std;
extern int a;
int main()
執行結果為:
可以得知main函式和class1裡面的a都是global.h中定義的那個a值。
用static也可以進行全域性變數的修飾,對於加static與不加static的全域性變數,加了static的話,就不能使用extern進行引用。用static修飾的全域性實際上是該編譯單元的全域性,而extern修飾的全域性,不同的編譯單元上的全域性。
示例**如下:
#pragma once
#include
static int y =
100;
void
func()
;
#include "class.h"
using namespace std;
void
func()
//main
#include
#include "class.h"
using namespace std;
int main()
執行結果如下:
可以發現main中的y與class中的y實際上是不在同乙個位址上,並不是同乙個y。
用static修飾區域性變數的話是將變數存在記憶體的靜態區,每次的值儲存到下次呼叫,程式結束的時候釋放。
運用static的時候也要注意static的宣告與定義是必須在一起的,static也不能與extern連用,也盡量把不要把static修飾放在標頭檔案中(應該放在原始檔中),這樣可以避免引用標頭檔案時不必要的拷貝。
參考網頁: c/c++中extern關鍵字詳解.
C語言基礎 extern 與 static
外部函式 如果在當前檔案中定義的函式允許其他檔案訪問 呼叫,就稱為外部函式。c語言規定,不允許有同名的外部函式。內部函式 如果在當前檔案中定義的函式不允許其他檔案訪問 呼叫,只能在內部使用,就稱為內部函式。c語言規定不同的原始檔可以有同名的內部函式,並且互不干擾。1 預設情況下所有函式都是外部函式 ...
c語言static與extern的用法
一,static和extern 大工程下我們會碰到很多原始檔。檔案a.c static int i 只在a檔案中用 int j 在工程裡用 static void init 只在a檔案中用 void callme 在工程中用 上面的全域性i變數和init 函式只能用在a.c檔案中,全域性變數sum的...
c語言static與extern的用法
一,static和extern 大工程下我們會碰到很多原始檔。檔案a.c static int i 只在a檔案中用 int j 在工程裡用 static void init 只在a檔案中用 void callme 在工程中用 上面的全域性i變數和init 函式只能用在a.c檔案中,全域性變數sum的...