日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C/C++中涉及存储方式的关键字:auto,static,register,extern2009-01-22 11:23auto关键字:

發布時間:2025/3/15 c/c++ 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C/C++中涉及存储方式的关键字:auto,static,register,extern2009-01-22 11:23auto关键字: 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C/C++中涉及存儲方式的關鍵字:auto,static,register,extern 2009-01-22 11:23

auto關鍵字
auto對象和變量被存儲在棧中,它的生命周期僅存在于它的聲明所在的塊(block)中。在塊中定義的塊如果不加其它的修飾符則都是auto類型的。auto關鍵字可以省去。auto對象和變量對外部模塊都是不可見的。

static關鍵字
它是C,C++中都存在的關鍵字,它主要有三種使用方式,其中前兩種只指在C語言中使用,第三種在C++中使用。
(1)局部靜態變量
(2)外部靜態變量/函數
(3)靜態數據成員/成員函數
下面就這三種使用方式及⒁饈孿罘直鶿得鰨?br> 一、局部靜態變量
與auto類型(普通)局部變量相比, static局部變量有三點不同:
1. 存儲空間分配不同,auto類型分配在棧上,屬于動態存儲類別,占動態存儲區空間,函數調用結束后自動釋放;而static分配在靜態存儲區,在程序整個運行期間都不釋放。兩者之間的作用域相同,但生存期不同。
2. static局部變量在所處模塊的初次運行時進行初始化工作,且只初始化一次。
3. 對于局部靜態變量,如果不賦初值,編譯期會自動賦初值0或空字符;而auto類型的初值是不確定的。(對于C++中的class對象例外,class的對象實例如果不初始化,則會自動調用默認構造函數,不管是否是static類型)
二、外部靜態變量/函數
在C中static有了第二種含義:用來表示不能被其它文件訪問的全局變量和函數。為了限制全局變量/函數的作用域,函數或變量前加static使得函數成為靜態函數。但此處“static”的含義不是指存儲方式,而是指對函數的作用域僅局限于本文件(所以又稱內部函 數)。注意此時,對于外部(全局)變量,不論是否有static限制,它的存儲區域都是在靜態存儲區,生存期都是全局的。此時的static只是起作用域限制作用,限定作用域在本模塊(文件)內部。使用內部函數的好處是:不同的人編寫不同的函數時,不用擔心自己定義的函數,是否會與其它文件中的函數同名。
三、靜態數據成員/成員函數(C++特有)
C++重用了這個關鍵字,并賦予它與前面不同的第三種含義:表示屬于一個類而不是屬于此類的任何特定對象的變量和函數。這是與普通成員函數的最大區別,也是其應用所在。比如在對某一個類的對象進行計數時,計數生成多少個類的實例,就可以用到靜態數據成員。在這里面,static既不是限定作用域的,也不是擴展生存期的作用,而是指示變量/函數在此類中的唯一性。這也是“屬于一個類而不是屬于此類的任何特定對象的變量和函數”的含義。因為它是對整個類來說是唯一的,因此不可能屬于某一個實例對象的。(針對靜態數據成員而言,成員函數不管是否是static,在內存中只有一個副本,普通成員函數調用時,需要傳入this指針,static成員函數調用時,沒有this指針)
注意:
不能將union成員聲明為static的,然而,對于全局的匿名union,必須顯式的聲明為static。

register關鍵字
只有函數參數和局部變量可被聲明為register。意思是,在可能的情況下,該變量被存儲在CPU寄存器中。register變量和auto變量一樣,它的生命周期只維持在它所聲明的塊中。編譯器并不贊成程序員指定register變量。實際的情況是,編譯器會根據全局優化的需要自動決定是否采用register類型。

extern關鍵字
extern用在聲明語句中表示該對象或變量是在其它編譯單元中(不能說是其它文件,因為有些文件,如頭文件不是編譯單元)定義的;如果用在定義語句中,表示該變量對外部可見。
注意extern與#include作用的區別:
例1,使用extern:
//out.h
int a = 10;

//out.cpp
#include "out.h"

//example.cpp
#include <iostream>
using namespace std;

extern int a;
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"a="<<a<<endl;

system("pause");
return 0;
}
編譯鏈接流程:
由于out.cpp文件引用了out.h文件,所以out.cpp文件的內容變成了int a = 10;,編譯時生成編譯單元out.obj(out.o),其中定義了變量a。example.cpp文件中出現了對a的引用cout<<"a="<<a<<endl;,但該文件中沒有a的定義(extern int a;只是一個聲明),而且包含的頭文件中也沒有,但是由于有聲明extern int a;,表明a是在其它編譯單元中定義的,編譯不出錯。最后鏈接器在編譯單元out.obj(out.o)中找到a的定義,建立連接關系,生成最后的exe文件。該工程中有兩個編譯單元,最后鏈接成一個exe文件。

例2,使用#include:
//out.h
int a = 20;

//example.cpp
#include "out.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
cout<<"a="<<a<<endl;

system("pause");
return 0;
}
編譯鏈接流程:
example.cpp文件中出現了對a的引用cout<<"a="<<a<<endl;,但該文件中沒有a的定義,但是包含的頭文件out.h中有,這樣在編譯之前,頭文件out.h展開到example.cpp文件中,相當于example.cpp文件中定義了a(int a = 20;),編譯成功。最后鏈接器鏈接編譯單元生成最后的exe文件。該工程中只有一個編譯單元,最后鏈接成一個exe文件。

總結

以上是生活随笔為你收集整理的C/C++中涉及存储方式的关键字:auto,static,register,extern2009-01-22 11:23auto关键字:的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。