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

2021-09-20 20:12:51 字數 3052 閱讀 9986

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

一、在沒有類定義的標頭檔案中定義全域性static變數g_static。

用gcc和g++都可以編譯。但執行結果顯示,在test.c和main.c中,變數的值相同,但位址不同,說明是兩個變數。

frank@userver:~/project/test/static-test/static1_c$ cat static.h 

#ifndef static_h

#define static_h

static int g_static = 56;

#endif // #ifndef static_h

frank@userver:~/project/test/static-test/static1_c$ cat test.h

#ifndef test_h

#define test_h

void test();

#endif // #ifndef test_h

frank@userver:~/project/test/static-test/static1_c$ cat test.c 

#include

#include "static.h"

#include "test.h"

void test()

frank@userver:~/project/test/static-test/static1_c$ cat main.c 

#include

#include "static.h"

#include "test.h"

int main()

frank@userver:~/project/test/static-test/static1_c$ g++ main.c test.c 

frank@userver:~/project/test/static-test/static1_c$ ./a.out 

[main.c] g_static(0x601040,56)

[test.c] g_static(0x601044,56)

frank@userver:~/project/test/static-test/static1_c$ gcc main.c test.c 

frank@userver:~/project/test/static-test/static1_c$ ./a.out 

[main.c] g_static(0x601040,56)

[test.c] g_static(0x601044,56)

二、在有類定義的標頭檔案中定義全域性static變數。

用g++可以編譯。

在類的成員函式中,g_static的位址保持一致,說明在類的不同的物件中會訪問到同乙個全域性static變數。

在類外部的函式中,執行結果與編譯順序有關。

在先編譯的檔案的函式中,g_static位址與類的成員函式一致,說明與類內部的g_static是同乙個變數。。

但是在後編譯的檔案的函式中,g_static的位址不同,說明是另乙個變數。

frank@userver:~/project/test/static-test/static1_cpp$ cat static.h 

#ifndef static_h

#define static_h

#include

using std::cout;

using std::endl;

static int g_static = 10;

class testtype

void show()const

};#endif // #ifndef static_h

frank@userver:~/project/test/static-test/static1_cpp$ cat test.h

#ifndef test_h

#define test_h

void test();

#endif // #ifndef test_h

frank@userver:~/project/test/static-test/static1_cpp$ cat test.cpp 

#include "test.h"

#include "static.h"

void test()

frank@userver:~/project/test/static-test/static1_cpp$ cat main.cpp 

#include "test.h"

#include "static.h"

int main()

frank@userver:~/project/test/static-test/static1_cpp$ g++ main.cpp test.cpp 

frank@userver:~/project/test/static-test/static1_cpp$ ./a.out 

main

g_static: (0x602078, 10)

this=0x7fff09eba08f, g_static:(0x602078, 10)

test

g_static = (0x60207c, 10)

this=0x7fff09eba05f, g_static:(0x602078, 10)

frank@userver:~/project/test/static-test/static1_cpp$ g++ test.cpp main.cpp 

frank@userver:~/project/test/static-test/static1_cpp$ ./a.out 

main

g_static: (0x60207c, 10)

this=0x7fffdad480ef, g_static:(0x602078, 10)

test

g_static = (0x602078, 10)

this=0x7fffdad480bf, g_static:(0x602078, 10)

frank@userver:~/project/test/static-test/static1_cpp$ 

三、結論:不要在標頭檔案中定義全域性static變數。

全域性變數在標頭檔案中「定義」

看著標題,定義上面加了乙個引號,這個得注意了。怎麼解釋呢,一般而言,變數只能定義在.c檔案中,宣告變數才在.h檔案中。下面就打破常規,把定義變數的語句放在.h檔案中,但是對實際而言,變數定義在標頭檔案中是表面上的。下面直接給出 有三個檔案a.h a.c main.c a.h裡面的 csharp vi...

inline函式定義在標頭檔案中

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

標頭檔案裡不要有全域性定義

由於乙個標頭檔案可能會被多次包含,所以有全域性定義的情況下,在鏈結會出現重定義錯誤 全域性定義不應該放在標頭檔案裡,應該放入其相應的實現檔案中。如果乙個標頭檔案裡的全域性定義被多個cpp檔案所使用,則只有乙個檔案可以include這個標頭檔案,其他只能是extern這些全域性宣告。如何乙個標頭檔案要...