close
英文全文翻譯 只履行一次翻譯社 main() 履行前由 "可載入履行檔 ELF" (或二進位影象 binary image) 拷貝至准確之 .data 區段位址內
無窮制, 任何運算式都可.C 語言的變數有所謂的 storage class翻譯社 初學時對傍邊的差別並非很輕易弄清晰, 後來天成翻譯公司把各類前提稍作清算, 於是有了下面的表格:
(區域變數) 函數參數 大分類 全域變數 區域變數 Key Word 無 static static auto (可略) 無 界說/宣佈1位置 函數外部 函數內 (或 {} 區塊內) 函數本體 變數名稱反複 編譯毛病. 專案中所有全域變數名稱需獨一
- 與統一區塊內的變數同名時, 編譯毛病.
- 與區塊外層變數同名時, 外層變數被掩蔽.
- 一共有 4 個 Storage Classes:
- 主動變數: automatic
- 外部變數: external
- 靜態變數: static
- 暫存器變數: register
- C 的變數大致分為二類: 外部變數 (external, 也能夠稱為全域變數) 及主動變數 (automatic翻譯社 或是區域變數). 兩者區分是以變數界說泛起在 .c 檔中的位置來區別: 由於 C 說話限制了函數區塊中弗成以再界說函數, (C++ 也不支援, 這點和 Javascript 是分歧的)翻譯社 所以函數區塊內的就是主動變數翻譯社 函數區塊外的就是外部變數. 這二種變數界說時都不需加 keyword 潤飾 (現實上, 外部變數沒有潤飾字; 主動變數的潤飾字是 auto, 但一般都省略)
- 外部變數紛歧定要出現在 .c 檔中的最前面, 可以安插在二個函數區塊的中央, 受影響的是該變數的 scope: 變數泛起之前的函數沒法利用該變數
- 靜態變數是外部變數或自動變數在界說時多加上 keyword static, 首要改變二件事: 改變變數利用的記憶體區段, 及縮小可視局限 (scope)
- 對主動變數來講: 改用外部變數利用的區域為 .bss6 或是 .data6, 所以可以沒必要每次重設初值, 上一次的值可以被保存下來.
- 對外部變數來講: 可視局限縮小到只在檔案內翻譯社 並且沒法被外部檔案設 extern 來參考 (算是某種水平上的 private)
- Keyword register 則是要求改用 CPU 內部的暫存器來寄存變數值翻譯社 而大部分 CPU 內部的暫存器都不多並且數量也分歧, 所以只能加在主動變數前面. 並且不包管達成翻譯社 沒法殺青時就降級變成主動變數.
- 函數的參數則是一種特化的主動變數, 通常爲預設利用 register 變數, 然則會根據 CPU 種類分歧而有些轉變. 例如:
- ARM CPU 的官方規範是函數的前 4 個參數會利用 r0~r3 來實作, 跨越 4 個參數的部分則利用 stack.
- 但 intel x86 CPU 則
只有利用 register A. 其他沒法利用利用 register 變數的參數都要利用 stack6 (參考 Wiki X86 calling conventions) - Keil C51 則預設不消 stack, 改用自動變數, 具體請參考這一篇C 說話:Keil C51 和標準 C 說話的差別
- 別的 C 還有二個變數的限制詞 (qualifier), const 和 volatile
- const 是限制該變數不能被點竄 (今朝大部分 C 編譯器 (例如:gcc, ARM/MDK) 會利用 .text6 區段翻譯社 這個區段可以在 link 時指定到 ROM/Flash 記憶體上. 然則 Keil C51 不會翻譯社 Keil C51 要用 const code 才會是用 ROM, 只用 const 還是會佔用 DATA RAM)
- volatile 是限定不成以被快取到 CPU 內部的暫存器, 必須每次存取都真實的讀/寫該變數所佔用的位址 (意即:指定該變數的存取動作不作最好化). 它常常泛起在定義週邊晶片的暫存器, 尤其是週邊晶片的輸入暫存器部分必然要加 volatile 不然編譯出來的履行碼沒法准確反應週邊晶片的現況. 還有多工環境中作為 semaphore 的變數也會要加上 volatile 這個 keyword.
備註:
(全域變數) 靜態變數 自動變數及其履行機會 限制只能利用常數運算式
life-time 程式履行期間 (或永遠) 函數內 (或 {} 區塊內) 函數內 初值(未設初值時) 0 (因為是利用 .bss 區段的關係) 未知 編譯毛病. 參數個數紛歧致4 初值設定限制5
文章標籤
C
C 說話
變數
static
external
Keil C51
.text
.bss
.data
c variable scope
c varibale lifetime
const
volatile
呼喚前履行設定 預設利用之記憶體區段 無初值 .bss6 stack6 register 或 stack6 有初值 .data6 stack6 register 或 stack6
前提/狀態 | 外部變數
申明: 文章出自: http://magicjackting.pixnet.net/blog/post/71949519-c-%e8%aa%9e%e8%a8%80%3a%e9%97%9c%e6%96%bc%e8%ae%8有關各國語文翻譯公證的問題歡迎諮詢天成翻譯公司02-77260931 |
---|
文章標籤
全站熱搜