C++靜態全域性變數
阿新 • • 發佈:2021-01-30
技術標籤:C++
遇到這麼一個神奇的問題。
//A.h #pragma once #include <iostream> static int a; void Get(); //A.cpp #include "A.h" void Get() { //輸出A地址 std::cout << "Get: " << &a << std::endl; } //main.cpp #include "A.h" int main() { Get(); //再次輸出A地址 std::cout << "main: " << &a << std::endl; return 0; }
初看,不是很簡單的問題嗎!輸出的地址是一樣的嘛!
看答案:
怎麼會這樣!!!
為什麼會這樣呢?明明同一個變數怎麼地址不一樣呢?原因其實很簡單:變數'a'被定義為了一個靜態變數,全域性的靜態變數有這麼一個性質:
靜態全域性變數在宣告它的整個檔案都是可見的,而在檔案之外是不可見的。
優點:靜態全域性變數不能被其它檔案所用;其它檔案中可以定義相同名字的變數,不會發生衝突。
所以上面的程式碼實際上是這樣的:
//A.cpp static int a; <--- void Get() { //輸出A地址 std::cout << "Get: " << &a << std::endl; } //main.cpp static int a; <--- int main() { Get(); //再次輸出A地址 std::cout << "main: " << &a << std::endl; return 0; }