C 靜態變數 全域性變數 const

2022-08-30 20:03:12 字數 1453 閱讀 7607

全域性陣列  不能被delete;

作用域:區分名字的不同意義的上下文。

c++中大多數作用域是用花括號界定的,名字從其宣告點到宣告所在作用域結束處都是可見的。

#include

int main()

int sum=0;

for(int val=1;val<10;val++)

sum++;

return 1;

名字main在花括號外,在整個程式都可見。定義在所有函式外部的名字 具有 全域性作用域(global scope)。

sum 有區域性作用域(local scope)    。就算在標頭檔案中有區域性變數的 extern宣告,也不是全域性變數,不能被其他檔案使用。

val只在for語句中使用 , 有 語句作用域(statement scope)。

全域性變數 ,又稱 外部變數, 在編譯時,全域性變數對檔案內部可見,鏈結後,(編譯產生的obj檔案被合併到一起)全域性變數的可見範圍被擴大到了整個程式。

所以檔案中定義的全域性變數若 重名的話,會在鏈結時出現重複定義的錯誤。

但是由於編譯器的目光不夠長,編譯階段全域性變數可見域只在檔案中,所以全域性變數不能在程式的任何地方被使用,這就用到了extern 來宣告乙個變數。告訴編譯器:「你現在編譯的檔案中,有乙個識別符號雖然沒有在本檔案中定義,但是它是在別的檔案中定義的全域性變數,你要放行!」

extern 關鍵字作用於區域性變數 沒有效果。

extern 「c」

在c++環境下使用c函式的時候,常常會出現編譯器無法找到obj模組中的c函式定義,從而導致鏈結失敗的情況,應該如何解決這種情況呢?

答案與分析:

c++語言在編譯的時候為了解決函式的多型問題,會將函式名和引數聯合起來生成乙個中間的函式名稱,而c語言則不會,因此會造成鏈結時找不到對應函式的情況,此時c函式就需要用extern 「c」進行鏈結指定,這告訴編譯器,請保持我的名稱,不要給我生成用於鏈結的中間函式名。

const :

const in defaultsize=30;//定義defaultsize為常量,初始化為30。defaultsize是乙個不可修改的左值。  因為不可修改,所以定義時必須初始化。

const 物件預設為檔案的區域性變數。

在全域性作用域中定義非const變數時,在整個程式中都可以訪問。

int counter; 定義在全域性作用域的全域性變數。非const變數預設為extern

extern int count; 宣告

++counter;// file2.cpp使用。

在全域性作用域宣告的const的物件是定義該物件的檔案的區域性變數。 只能在那個檔案中使用,不能被其他檔案訪問。

通過extern制定const變數為extern(定義時),就可以在整個程式中被訪問。

extern const int defaultsize=30;定義

extern const int defaultsize; 宣告

全域性變數 靜態變數 區域性變數 const變數

生命週期 作用域 作用域生命週期 定義方法 記憶體分布 注意全域性變數 全域性作用域 只需在乙個原始檔定義,就可作用於所有原始檔 程式執行期一直存在 引用方法 其他檔案中要使用必須用 extern 關鍵字宣告,或通過包含標頭檔案的方式 全域性 靜態 儲存區 如果兩個檔案中都定義了相同名字的全域性變數...

區域性變數,區域性靜態變數,全域性變數,全域性靜態變數分別

c 記憶體到底分幾個區?一 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。3 全域性...

全域性變數,全域性靜態變數,區域性靜態變數,區域性變數

變數可以分為全域性變數 靜態全域性變數 靜態區域性變數和區域性變數。按照儲存區分 全域性變數 靜態全域性變數和靜態區域性變數都存放在記憶體的全域性資料區,區域性變數存放在記憶體的棧區。按作用域分 全域性變數在整個工程檔案內都有效 靜態全域性變數只在定義它的檔案內有效 靜態區域性變數只在定義它的函式內...