個人筆記 extern和static 區分

2021-06-20 04:47:28 字數 2069 閱讀 8588

extern 關鍵字宣告變數或者函式為外部變數或函式。表示變數或者函式體在外部檔案被定義。編譯器遇到此申明會到其他模組中尋找改函式體或變數。

static 申明變數或函式為靜態;靜態的函式或者變數使該變數或者函式只能作用於本檔案。通俗點講就是,只能是本檔案內部使用,其他檔案哪怕是定義乙個相同的都與我無關,編譯器也不會報錯。這也是其好處;未經初始化的靜態變數初值都為0;靜態變數都再全域性資料區儲存;包括靜態全域性變數,靜態區域性變數;

在記憶體中的分布情況如下:

**區 //low address

全域性資料區

堆區棧區 //high address

一般程式把新產生的動態資料

存放在堆區,函式內部的自動變數

存放在棧區。自動變數一般會隨著函式的退出而釋放空間,靜態資料(即使是函式內部的靜 態區域性變數)也存放在全域性資料區。全域性資料區的資料並不會因為函式的退出而釋放空間。

靜態區域性變數有以下特點:

該變數在全域性資料區分配記憶體;

靜態區域性變數在程式執行到該物件的宣告處時被首次初始化,即以後的函式呼叫不再進行初始化;

靜態區域性變數一般在宣告處初始化,如果沒有顯式初始化,會被程式自動初始化為0;

靜態函式: 

在函式的返回型別前加上static關鍵字,函式即被定義為靜態函式。靜態函式與普通函式不同,它只能在宣告它的檔案當中可見,不能被其它檔案使用。

對於非靜態資料成員,每個類物件都有自己的拷貝。而靜態資料成員被當作是類的成員。無論這個類的物件被定義了多少個,靜態資料成員在程式中也只有乙份拷 貝,由該型別的所有物件共享訪問。也就是說,靜態資料成員是該類的所有物件所共有的。對該類的多個物件來說,靜態資料成員只分配一次記憶體,供所有物件共 用。所以,靜態資料成員的值對每個物件都是一樣的,它的值可以更新。靜態的類資料成員分配在全域性區,哪怕是該類沒有例項化乙個物件,我們都可以訪問它;靜態成員之間可以相互訪問,包括靜態成員函式訪問靜態資料成員和訪問靜態成員函式;

非靜態成員函式可以任意地訪問靜態成員函式和靜態資料成員;

靜態成員函式不能訪問非靜態成員函式和非靜態資料成員;

eg:1.cpp中定義char a;如果想在2.cpp中使用,那麼2,cpp中使用時,這麼用extern char a;

如果定義char a[5];定義乙個陣列,在 2.cpp中要要使用該數字,那麼必須這麼宣告 extern char a; 如果是申明為extern char *a;會出錯,原因是extern char *a,只告訴編譯器有乙個外部的指向字串的指標。宣告可以多次使用,可以在多個檔案中使用。int a ,與extern int a ,乙個是定義乙個變數,乙個是申明乙個變數,大爺的。細節啊;全部交給大學老師了.......汗

在乙個檔案中定義乙個函式,宣告為外部extern

eg: 1.cpp中定義如下函式:

#include "stdafx.h"

#include"iostream"

using namespace std;

//extern static my aa;

//extern static my bb; //如果申明為static 則有錯誤;

extern my aa; // 在2.cpp中定義的全域性變數

extern my bb; //

void fun()

{ cout<<"test static aa:"<

在2.cpp中定義了

#pragma once

#include "stdafx.h"

#include"iostream"

using namespace std;

my aa,bb; // 定義兩個全域性自定義的結構體。在stdafx,h中

//static my aa,bb; //如果是靜態的,則,fun()函式裡的變數永遠都是0,不會隨2.cpp賦值而改變;

extern int temp1;

extern void fun();

int _tmain(int argc, _tchar* argv)

{ bb.a =1;

bb.b =1;

aa.a =0;

aa.b=0;

cout<

Linux裡stat命令與stat和lstat函式

1.stat命令,可以獲取檔案的詳細資訊 命令列輸入 stat filename 2.stat函式 標頭檔案 include include include 介面 extern int stat const char restrict file,struct stat restrict buf 引數...

Linux許可權管理和Stat

檔案訪問者的分類 檔案和檔案目錄的所有者 u user 檔案和檔案目錄的所有者所在的組的使用者 g group 其它使用者 o others 檔案訪問許可權的種類 事物屬性 讀 r 對檔案而言,具有讀取檔案內容的許可權 對目 錄來說,具有瀏覽該目錄資訊的許可權 寫 w write對檔案而言,具有修改...

Ajax的readyState和status屬性

readystate屬性包括五種可能的取值 0 未初始化 send方法還沒有被呼叫 1 載入中 已呼叫了send方法,請求還在處理 2 已載入 send方法已完成,整個應答已接收 3 互動中 正在解析應答 4 已完成 應答已經解析,準備好進行下一步處理。物件xmlhttprequest 屬性stat...