能否在標頭檔案中定義全域性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這些全域性宣告。如何乙個標頭檔案要...