close

俄文口譯價位(區域變數)

函數參數 大分類 全域變數 區域變數 Key Word 無 static static auto (可略) 無 界說/宣佈1位置 函數外部 函數內 (或 {} 區塊內) 函數本體 變數名稱反複 編譯毛病. 專案中所有全域變數名稱需獨一
  • 與同一區塊內的變數同名時, 編譯毛病.
  • 與區塊外層變數同名時翻譯社 外層變數被掩蔽.
在外部檔案 (.c/.h) 中利用(或參考) 外部檔案中變數宣佈的前面加上 extern 便可 外部檔案中無法使用(或參考) 在界說的區塊外即無法利用 函數區塊外即沒法使用 可視範圍2

C 說話的變數有所謂的 storage class翻譯社 初學時對傍邊的差異並非很輕易弄清晰, 後來天成翻譯公司把各類條件稍作整理翻譯社 於是有了下面的表格:

  1. 定義會保存記憶體翻譯社 宣佈則不會. 對變數來說除 extern 是宣佈之外, 其他的都是定義.
  2. 可視規模: 是指在程式的那一個段落可使用該變數. 主動變數 (使用 stack 堆疊區) 在離開界說他的 {} 區塊後就有可能被他人佔用, 所以可視範圍同生命期. 外部變數一分開界說的檔案就不成視, 但可使用 extern 宣佈來從新取得. (實際上, 幫我們完成這件事的是 linker). 但靜態變數則限制不行以被 extern 的宣佈獲得可視性. (compiler 的語法檢查阻止了我們獲得其可視性)
  3. 生命期: 是指變數佔用記憶體的時候, 只有自動變數 (利用 stack 堆疊區) 可以重覆利用記憶體空間, 其他都是永久佔據 (embebbed system) 或載入履行時佔用.
  4. 指未使用 va_arg (改觀個數參數)的情形. 若使用 va_arg, 需運用一些技能搜檢參數個數翻譯社 不然會發生使用毛病的參數, 或引發程式當掉.
  5. 初值設定指的在界說變數時, 追隨在其後的等號 (=) 及厥後的運算式
  6. .text翻譯社 .bss翻譯社 .data 是一般編譯器之預設記憶體區段名稱, linker (或者是 loader) 會放置現實的記憶體位址給各個區段.
  • .text 為唯讀區段, 放置程式及常數資料 (小型 embedded system 會將之安置於 ROM/Flash 中)
  • .data 為可讀寫區段, 放置初值不為 0 的變數 (使用 ROM/Flash 時會先附在 .text 以後). 在 main() 最先履行前翻譯社 由 "可載入執行檔 ELF" (或二進位影像 binary image) 拷貝至准確之 .data 區段位址內, 是故外部變數或靜態變數的初始值只能用常數運算式
  • .bss 為可讀寫區段翻譯社 放置初值為 0 的變數. 在 main() 起頭執行前, .bss 區段會被清為 0
  • stack 為堆疊區 (大陸用語: 棧) 通常爲呼喚函數時的作業區 (返回位址暫存翻譯社 傳遞參數, 區域變數和返回值之儲存區), heap 為聚積區 (大陸用語: 堆) 是呼喚 malloc() 時獲得記憶區塊的來源.

申明:

每次進入函數或區塊後立即履行 無窮制

(全域變數) 靜態變數 主動變數
scope 自界說位置 (不必需在檔案的最前面) 至檔案竣事 函數內 (或 {} 區塊內) 函數內 生命期3
life-time 程式履行時代 (或永久) 函數內 (或 {} 區塊內) 函數內 初值(未設初值時) 0 (因為是利用 .bss 區段的關係) 未知 編譯毛病. 參數個數紛歧致4 初值設定限制5
及其履行時機 限制只能利用常數運算式
呼喚前執行設定 預設使用之記憶體區段 無初值 .bss6 stack6 register 或 stack6 有初值 .data6 stack6 register 或 stack6

Mem Map2
Mem Map1

備註:

只履行一次

, main() 執行前由 "可載入執行檔 ELF" (或二進位影象 binary image) 拷貝至准確之 .data 區段位址內

無窮制, 任何運算式都可.
  • 一共有 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)
    附帶一提: static 也能夠加在函數定義的前面, 也是表示這個函數是內部函數, 可視規模縮小到只在檔案內翻譯社 並且沒法被外部檔案設 extern 來參考.
  • 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)翻譯社 constvolatile
    • 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.
文章標籤
C C 語言 變數 static external Keil C51 .text .bss .data c variable scope c varibale lifetime const volatile
C 說話變數
條件/狀態 外部變數


本篇文章引用自此: 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
arrow
arrow
    文章標籤
    翻譯社
    全站熱搜
    創作者介紹
    創作者 normano1jr3 的頭像
    normano1jr3

    mattheflodux

    normano1jr3 發表在 痞客邦 留言(0) 人氣()