1. 程式人生 > 其它 >c++中規範使用全域性變數

c++中規範使用全域性變數

技術標籤:c++c++程式碼規範extern

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