亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++中的extern聲明變量詳解

2020-01-26 15:09:31
字體:
來源:轉載
供稿:網友

extern聲明變量無外乎如下兩種:

1、聲明全局變量
2、聲明函數

今天我們只談extern,什么const、static之類等等與之相關或不相關的一律忽略,下面就分別對以上兩種情況一一講解

聲明和定義
既然提到extern聲明變量,那我們就必須搞清楚聲明和定義的區別。

這里我們將普通數據變量和函數統稱變量。從內存分配角度來說,聲明和定義的區別在于聲明一個變量不會分配內存,而定義一個變量會分配內存。一個變量可以被聲明多次,但是只能被定義一次。

基于以上前提,我們可以把聲明和定義類比為指針和內存的關系。我們知道,指針其實就是指向內存的一個符號,變量的定義就好比一塊內存區域,而聲明就好比它的指針,可以有多個指針指向同一個內存區域,而一個指針只能指向一個內存區域,這樣就很好理解為什么變量只能被定義一次,如果被定義多次,那就會分配多個內存,這樣你通過變量的聲明到底去找哪塊內存區域呢,這會是個問題。

對于數據來說,聲明和定義往往是同時存在的,比如下面的一行語句

復制代碼 代碼如下:

int data; 

這樣既聲明了data同時也定義了data,怎樣做到只聲明而不定義呢,用extern就可以了
復制代碼 代碼如下:

extern int data;

對于函數來說,聲明和定義就很容易區分了,一般我們會將聲明放在頭文件而將定義放在源文件里
復制代碼 代碼如下:

void hello(); 

這是一個函數的聲明,而
復制代碼 代碼如下:

void hello() 

    printf("hello world!/n"); 
}  

這是一個函數的定義。當然,函數的聲明和定義也可以同時發生,如果我們沒有頭文件而只有源文件,并且在源文件里并沒有void hello();這樣的語句,那么這個函數的聲明和定義就同時發生了,此時如果我們在原文件里想要調用函數hello(),你調用的代碼必須在函數定義之后。

其實上面的要點只在于一句話:使用變量之前必須聲明,聲明可以有多次,而定義只能有一次。記住這句話,后面的就都很容易理解了。

extern聲明全局變量

我們先來看如下例子,現有三個文件:test.h, test.cpp, main.cpp,其中main.cpp和test.cpp需要共享一個變量g_name,三個文件的內容如下

復制代碼 代碼如下:

/* test.h */ 
#ifndef _TEST_H_ 
#define _TEST_H_ 
 
#include <string> 
 
std::string g_name; 
void hello(); 
 
#endif 
 
/* test.cpp */ 
#include <stdio.h> 
#include "test.h" 
 
void hello() 

    printf("hello %s!/n", g_name.c_str()); 

 
/* main.cpp */ 
#include "test.h" 
 
std::string g_name; 
 
int main() 

    g_name = "Handy"; 
    hello(); 
    return 0; 

三者關系為,test.cpp包含了test.h,main.cpp也包含了test.h,這里的包含其實就是include。我們執行編譯命令

復制代碼 代碼如下:

g++ main.cpp test.cpp 

編譯報錯redefinition of 'g_name',說的是g_name被重定義了

我們看一下g_name出現的地方,一個是在test.h里,一個是在main.cpp里,兩條語句都是std::string g_name,前面我們已經說過,這樣的方式既聲明也定義了變量,那g_name是如何被重定義的呢,首先我們需要理解include的含義,我們可以將include一個頭文件理解為在該行展開頭文件里的所有代碼,由于main.cpp包含了test.h,我們在那一行將test.h的內容展開,就會發現main.cpp里有兩句std::string g_name;所以在main.cpp里,g_name被定義了兩次。

由于我們可以將include頭文件理解為展開代碼,所以編譯的時候其實不需要指定頭文件,只需要源文件就夠了。需要注意的是,重定義并不是指在同一個原文件里定義多次,而是指在整個代碼空間里,比如上面的例子是就是指在test.cpp和main.cpp里,其實上面的例子里g_name是被重定義了三次,其中test.cpp里一次,main.cpp里兩次。

那上面重定義的問題怎么解決呢,很簡答,將test.h里的std::string g_name;改為extern std::string g_name;就可以了,由于extern語句只聲明變量而不定義變量,因此test.cpp和main.cpp展開頭文件后,也只是將g_name聲明了兩次,而真正的定義還是在main.cpp里

extern聲明函數

還是上面的例子,我們怎么在main.cpp里不包含頭文件就可以調用hello函數呢,既然今天的主題是extern,不用提醒也知道,使用extern就可以了,代碼如下

復制代碼 代碼如下:

/* test.cpp */ 
#include <string> 
#include <stdio.h> 
 
// 聲明g_name 
extern std::string g_name;         
 
// 聲明和定義void hello() 
void hello()                       

    printf("hello %s!/n", g_name.c_str()); 

 
/* main.cpp */ 
#include <string> 
 
// 聲明和定義g_name 
std::string g_name;    
 
// 聲明void hello()            
extern void hello();              
 
int main() 

    g_name = "Handy" 
    hello(); 
    return 0; 

注意這里用到extern聲明變量和函數兩種場景,我分別在語句后面做了注釋。編譯命令如下

復制代碼 代碼如下:

g++ main.cpp test.cpp 

這里我們并沒有用到頭文件,但是依然可以在不同文件間共享變量和函數,這一切都是extern的功勞!

總結

要了解extern主要搞清以下幾個概念:

1、聲明和定義的區別。全局代碼空間里,變量可以有多個聲明,但只能有一個定義
2、include頭文件等同于展開頭文件里的代碼

了解了以上兩點,再來分析extern的用法,是不是就會清晰很多了

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久电影免费观看完整版| 亚洲影院色在线观看免费| 欧美色图在线视频| 伦理中文字幕亚洲| 4444欧美成人kkkk| 色青青草原桃花久久综合| 综合国产在线观看| 国产精品视频内| 午夜精品久久久久久久久久久久| 国产精品扒开腿做| 国产偷亚洲偷欧美偷精品| 日本午夜精品理论片a级appf发布| 久久久久久久国产精品| 欧美精品第一页在线播放| 欧美有码在线观看视频| 狠狠色狠狠色综合日日小说| 欧美激情国产高清| 久久躁日日躁aaaaxxxx| 日韩av色在线| 精品国产一区二区三区久久久| 亚洲人成网7777777国产| 久久久久久网站| 亚洲国产精品福利| 亚洲久久久久久久久久久| 色妞久久福利网| 在线电影av不卡网址| 久久久久久久久久久久久久久久久久av| 亚洲美女av黄| 久久777国产线看观看精品| 亚洲欧美日韩精品久久奇米色影视| 色综合影院在线| 国产日韩精品综合网站| 日韩中文在线中文网三级| 欧美在线精品免播放器视频| 国产又爽又黄的激情精品视频| 狠狠躁夜夜躁久久躁别揉| 国产亚洲欧洲在线| 亚洲第一中文字幕在线观看| 奇米一区二区三区四区久久| 最近日韩中文字幕中文| 色婷婷亚洲mv天堂mv在影片| 精品亚洲一区二区三区| 成人高清视频观看www| 国产亚洲视频在线| 欧美视频在线观看 亚洲欧| 日韩在线国产精品| 欧美又大粗又爽又黄大片视频| 日韩精品福利在线| 欧美激情乱人伦| 国产在线高清精品| 5566成人精品视频免费| 欧美黑人又粗大| 国产精品视频久久久| 欧美一级bbbbb性bbbb喷潮片| 91九色蝌蚪国产| 亚洲人成网站999久久久综合| 久久精品视频中文字幕| 2019中文字幕在线免费观看| 26uuu另类亚洲欧美日本老年| 日韩在线精品视频| 亚洲午夜性刺激影院| 亚洲精品日韩欧美| 精品国产自在精品国产浪潮| 亚洲午夜国产成人av电影男同| 中文字幕在线成人| 国产欧美精品在线播放| 久久精品国产99国产精品澳门| 欧美日韩性生活视频| 91国产在线精品| 国产亚洲一区精品| 欧美黑人狂野猛交老妇| 日韩国产激情在线| 欧美小视频在线| 国模精品系列视频| 久久精品国产免费观看| 欧美日韩在线视频一区二区| 久久国产精品久久久久久久久久| 国产91精品最新在线播放| 中文字幕一精品亚洲无线一区| 国产精品尤物福利片在线观看| 国产在线视频91| www国产精品com| 精品久久久久久| 欧美激情一区二区三级高清视频| 日韩免费在线免费观看| 欧美一区二区三区免费观看| 一区二区三区美女xx视频| 亚洲欧美日本另类| 欧美日韩国产中字| 26uuu另类亚洲欧美日本一| 亚洲а∨天堂久久精品喷水| 亚洲一区二区黄| 日韩一二三在线视频播| 国产深夜精品福利| 国产精品久久一区主播| 91精品国产高清自在线看超| 久久久久久久久久国产| 亚洲欧美资源在线| 亚洲免费电影在线观看| 91国在线精品国内播放| 亚洲欧洲国产一区| 国产男人精品视频| 久久精品成人欧美大片古装| 久久久久久久久电影| 操91在线视频| 亚洲男人天堂视频| 日韩欧美在线中文字幕| 国产日韩换脸av一区在线观看| 精品久久香蕉国产线看观看亚洲| 欧美电影免费观看电视剧大全| 韩国三级日本三级少妇99| 91九色国产在线| 亚洲xxxx妇黄裸体| 91精品视频网站| 懂色av一区二区三区| 亚洲aⅴ日韩av电影在线观看| 久久深夜福利免费观看| 性夜试看影院91社区| 国产一区二区三区日韩欧美| 亚洲欧美日韩精品久久奇米色影视| 91亚洲精品视频| 国产精品电影一区| 国内精品久久久久| 亚洲aa中文字幕| 久久精品国产亚洲| 午夜免费在线观看精品视频| 精品毛片三在线观看| 全色精品综合影院| 国产亚洲精品一区二555| 日韩精品中文字幕在线观看| 国产午夜精品全部视频在线播放| 国产精品网红直播| 日韩中文在线视频| 国产精品免费久久久| 久久人人爽人人爽人人片av高请| 欧美乱人伦中文字幕在线| 在线视频亚洲欧美| 欧美国产视频一区二区| 米奇精品一区二区三区在线观看| 亚洲欧美色图片| 欧美日韩国产精品一区| 国产精品欧美一区二区三区奶水| 色婷婷综合成人av| 亚洲欧洲av一区二区| 亚洲精品电影网| 91精品国产91久久久| 色妞在线综合亚洲欧美| 国产精品一区二区久久| 欧美日韩裸体免费视频| 中文字幕国产亚洲| 黑人精品xxx一区| 日韩成人免费视频| 激情亚洲一区二区三区四区| 亚洲三级av在线| 欧美日韩国产综合视频在线观看中文| 成人观看高清在线观看免费| 成人黄色激情网| 久久久久久久国产精品| 91精品国产综合久久香蕉922| 色阁综合伊人av| 色偷偷9999www| 日本伊人精品一区二区三区介绍| 久久视频这里只有精品| 亚洲色图狂野欧美|