程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中的extern聲明變量詳解

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

編輯:關於C++

C++中的extern聲明變量詳解。本站提示廣大學習愛好者:(C++中的extern聲明變量詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中的extern聲明變量詳解正文


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的用法,是否是就會清楚許多了

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved