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

2021-10-23 06:04:20 字數 1711 閱讀 2034

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

static const wchar_t* g_str1 = …

static const wchar_t* g_str2 = …

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

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

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

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

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

#pragma once

static int g_int = 3;

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

#pragma once

void testsource1();

void testsource2();

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

#include #include "header.h"

void testsource1()

#include #include "header.h"

void testsource2()

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

#include "functions.h"

int wmain()

執行該程式:

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

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

#pragma once

extern int g_int;

#include #include "header.h"

int g_int = 3;

void testsource1()

其它檔案不變。

可以看到,這次兩個原始檔中使用的都是同乙個變數。

要注意的是,使用extern宣告變數時不能帶有初始值,否則仍然屬於變數定義,會出現變數重定義的錯誤。

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

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

inline函式定義在標頭檔案中

寫這個內聯函式的時候也沒細想,結果違反了inline函式的要求。所謂內聯函式,就是編譯器將函式定義 之間的內容 在函式呼叫處展開,藉此來免去函式呼叫的開銷。如果這個函式定義在標頭檔案中,所有include該標頭檔案的編譯單元都可以正確找到函式定義。然而,如果內聯函式fun 定義在某個編譯單元a中,那...

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

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