全局變量、局部變量、靜態全局變量、靜態局部變量的區別
c++變量根據定義具有不同的生命周期,會有不同的作用域,主要有六個作用域:全局作用域,局部作用域,文件作用域,類作用域,語句作用域,命名空間作用域。
從作用域看:
全局變量:具有全局作用域,全局變量只需在一個源文件定義,就能在所有的文件中使用。在不含有該全局變量的文件中使用時,需要用extern的關鍵字聲明這個變量
靜態全局變量:具有文件作用域,它只作用域定義該變量的文件中,不能作用域其他文件。
**局部變量:**具有局部作用域,在程序運行期間并不是一直存在,而是只在函數運行期間存在,函數調用完成后,該變量就自動銷毀
靜態局部變量:具有局部作用域,它只初始化一次,在程序運行期間一直存在,與靜態全局變量的區別在于,靜態全局變量在該源文件的所有函數是可見的,而靜態局部變量旨在只在定義該變量的函數中可見。
從內存空間看:
- 靜態全局變量、靜態局部變量、全局變量都是在靜態存儲區(.bss 和 .data段)
- 局部變量是在棧區
靜態變量和棧變量(存儲在棧中的變量)、堆變量(存儲在堆中的變量)的區別:靜態變量存儲在靜態存儲區(.data段)中,在下一次調用時它能恢復到原來的數值,棧變量、堆變量不能保證是原來的值
全局變量和靜態變量的區別:靜態變量用static關鍵字修飾,只在自己的作用域上可見,全局變量是所有文件都可見
注意:全局變量定義在頭文件中有什么問題?
如果在頭文件中定義全局變量,在多個文件#include這個頭文件時,會出現全局變量重復定義,全局變量的作用域是所有文件都有使用的