在標頭檔案中使用static定義變數意味著什麼

2021-06-16 07:32:32 字數 2678 閱讀 8462

出處:

看到有一位同學在標頭檔案中這麼寫:

1staticconstwchar_t* g_str1 = …

2staticconstwchar_t* g_str2 = …

這種定義變數的方式我從來沒有見過,而且它還能順利通過編譯,於是我很想知道編譯器是如何處理這種變數定義的。

定義全域性變數時使用static,意味著該變數的作用域只限於定義它的原始檔中,其它原始檔不能訪問。既然這種定義方式出現在標頭檔案中,那麼可以很自然地推測:包含了該標頭檔案的所有原始檔中都定義了這些變數,即該標頭檔案被包含了多少次,這些變數就定義了多少次。

假如將上面兩行**的static去掉,編譯的時候就會出現變數重定義的錯誤,這進一步證實了上面的推測,因為沒有static的話變數的作用域是全域性的,定義了兩個以上的同名變數就會出現該錯誤。

推測終究是推測,要真正證實這個推測還要通過寫**來驗證。驗證的方式是:在標頭檔案中使用static定義變數,在多個原始檔中包含該標頭檔案,然後在每個原始檔中輸出變數的位址,同時在乙個原始檔中改變變數的值並輸出,在另乙個原始檔中也輸出。如果每個原始檔的輸出都不同,則推測得證;否則推測是錯誤的。

下面是定義變數的標頭檔案的**:

1

2#pragma once

3

4staticintg_int = 3;

接下來在另乙個標頭檔案中宣告兩個測試函式:

1

2#pragma once

3

4voidtestsource1();

5voidtestsource2();

分別在兩個原始檔中定義這兩個測試函式:

01

02#include

03#include "header.h"

04

05voidtestsource1()

1

2#include

3#include "header.h"

4

5voidtestsource2()

最後在main函式中呼叫這兩個測試函式:

1

2#include "functions.h"

3

4intwmain()

執行該程式:

可以看到,雖然在**中好像使用了相同的變數,但是實際上使用的是不同的變數,在每個原始檔中都有單獨的變數。所以,在標頭檔案中定義static變數會造成變數多次定義,造成記憶體空間的浪費,而且也不是真正的全域性變數。應該避免使用這種定義方式。

作為對比,下面使用正確的方式來定義全域性變數:

1

2#pragma once

3

4externintg_int;

01

02#include

03#include "header.h"

04

05intg_int = 3;

06

07voidtestsource1()

其它檔案不變。

執行程式:

可以看到,這次兩個原始檔中使用的都是同乙個變數。要注意的是,使用extern宣告變數時不能帶有初始值,否則仍然屬於變數定義,會出現變數重定義的錯誤。

勿在標頭檔案中定義static變數

看到有一位同學在標頭檔案中這麼寫 static const wchar t g str1 static const wchar t g str2 這種定義變數的方式我從來沒有見過,而且它還能順利通過編譯,於是我很想知道編譯器是如何處理這種變數定義的。定義全域性變數時使用static,意味著該變數的作...

能否在標頭檔案中定義全域性static變數?

能否在標頭檔案中定義全域性static變數?一 在沒有類定義的標頭檔案中定義全域性static變數g static。用gcc和g 都可以編譯。但執行結果顯示,在test.c和main.c中,變數的值相同,但位址不同,說明是兩個變數。frank userver project test static ...

不要在標頭檔案中使用using namespace

在這裡,我毫不迴避地說了這句話 引用我再也不想在任何標頭檔案中看到 using namespace 了 作為乙個開發者 團隊領導者,我經常會去招聘新的專案成員,有時候也幫助其他組的人來面試應聘者。作為應聘流程之一,我經常要求應聘者寫一些 因此我檢查過相當多的 在最近提交的c 中,我注意到乙個趨勢,在...