c++中規範使用全域性變數
阿新 • • 發佈:2021-02-10
c++中規範使用全域性變數
一、static/extern全域性變數的區別
在qt c++程式設計中經常出現段錯誤、變數聲名未前置extern等問題,經排查為全域性變數使用不規範導致。
static/extern主要用來定義全域性變數,static和extern的區別在於全域性變數作用範圍:
static宣告的全域性變數僅在包含該宣告的當前原始碼檔案中有效,跨檔案失效,換句話說就是在不同原始碼檔案中是不同的變數;
extern宣告的全域性變數則在所有包含該宣告的原始碼檔案中有效,其值在在不同原始碼檔案中是共享的,換句話說extern的全域性變數是真正的全域性變數。
static/extern的用法也有差異,分別說明如下:
二、static的規範用法:
1、在標頭檔案中使用static宣告定義全域性變數並初始化;
2、原始碼檔案中#include包含上述標頭檔案,即可直接使用;
3、如全域性變數宣告時有名稱空間,使用時也要帶上該名稱空間,當然也可以使用using namespace來指定預設的名稱空間。
三、extern的規範用法:
1、在標頭檔案中使用extern宣告定義全域性變數。
2、在所有使用該全域性變數的原始碼檔案中#include包含上述標頭檔案。
3、僅在第一次使用該全域性變數的原始碼檔案的最外層初始化,避免重複初始化。
4、如全域性變數宣告時有名稱空間,初始化和使用時也要帶上該名稱空間,當然也可以使用using namespace來指定預設的名稱空間。
四、示例
example1.h
......
static int var1;
extern int var2;
.......
example1.cpp
#include "example1.h" #include <iostream> test1() { var1++; std::cout<<"[test1] var1:"<<var1<<std::endl; var2++; std::cout<<"[test1] var2:"<<var2<<std::endl; }
example.cpp
#include "example1.h"
#include <iostream>
int var2=2; //注意此處初始化extern全域性變數為2
void test()
{
var1++;
std::cout<<"[test] var1:"<<var1<<std::endl;
var2++;
std::cout<<"[test] var2:"<<var2<<std::endl;
}
main()
{
test();
test2();
}
執行輸出:
[test] var1: 1
[test] var2: 3
[test1] var1: 1
[test1] var2: 4