跳至內容

C++/變量

維基教科書,自由的教學讀本
< C++

變量的聲明與定義

[編輯]

全局、局部、類成員的變量

[編輯]

變量的數據類型

[編輯]

變量的作用域

[編輯]

變量的生存期與鏈接性

[編輯]

生存期(storage duration)是指變量從生到死的時間。鏈接特性(linkage)是指名字在編譯單元以外是否引用到同一實體。

生存期(storage duration)包括:

  • 自動生存期(automatic storage duration):局部變量,從它的定義開始了生存期,它的定義所在的塊(block)的結束而終止了該變量的生存期。
  • 線程生存期(thread storage duration):線程創建時開始了變量的生存期,線程結束時終止變量的生存期
  • 靜態生存期(static storage duration):進程創建時開始了變量的生存期,進程結束時終止變量的生存期
  • 動態生存期(dynamic storage duration):顯式申請、釋放內存。

鏈接特性(linkage)包括:

  • 內部鏈接性(internal linkage):名字在當前編譯單元的各作用域中有效。下述在命名空間中聲明的名字具有內部鏈接性:聲明為static的變量、變量模板、函數、函數模板;const變量,且non-volatile non-template、non-inline、non-exported,沒有聲明為extern,此前也沒有聲明為外部連結性;匿名聯合的數據成員;匿名命名空間或其子空間中的一切名字,即使被聲明了extern,都是內部鏈接性。
  • 外部連結性(external linkage):名字在其他編譯單元中也可用於指向同一實體。
  • 無鏈接性(no linkage):塊作用域中聲明的名字,對下述情形,都是無鏈接性,即只能在該作用域中引用該名字:
    • 變量沒有明確聲明為extern(無論是否有static修改符)
    • 局部類與其成員函數
    • 塊作用域中聲明的其他名字,如typedefs, enumerations, enumerators

指示字static只用於對象聲明(但不能用於函數形參列表)、函數聲明(不能用於塊作用域)、匿名聯合的聲明。在類成員聲明,它聲明了一個靜態成員。在聲明對象時,它指出了靜態生存期,但如果與thread_local一起用,有不同含義;如果聲明是在命名空間作用域,它指出內部鏈接性。

指示字extern只用於變量與函數的聲明(不包含類成員或函數形參)。它指出了外部連結性,技術上不影響生存期,但它不能用於自動生存期對象,因此所有外部連結性對象都具有靜態或線程生存期。一個變量聲明使用了extern但沒有初始化,不被認為是變量的定義。

關鍵字thread_local只允許聲明對象在命名空間作用域、塊作用域或靜態數據對象。指示對象具有線程生存期。靜態數據對象只能具有外部連結性。額外的static指示字表明對象具有內部鏈接性。 額外的extern指示字表明對象具有外部連結性。