作者motocyman (無言了)
看板C_and_CPP
標題Re: [問題] global variable的問題
時間Wed Jun 9 13:43:37 2010
: 1. 如果用static宣告在main.h裡的變數的話
: 是否會變成所有*.cpp都會產生static變數呢? 這樣是不是有點占空間阿?
是一定占空間,想像一下你沒有要用到,卻還宣告一下 private int temp;
除非聰明的compiler會不會幫你省?!…
: (我只想要在main.cpp有此變數,用static寫法妥當嗎?)
在書上有看到說
如果只有這個 main.cpp or main.c檔會用到的變數,其它不會用到的話
就放在自己的.cpp .c檔裡就好了
所以 static variable static function 就別放在.h檔
※ 引述《LPH66 (-858993460)》之銘言:
: ※ 引述《Trumen (真好多人)》之銘言:
: compile link
: .cpp ==========> .obj ───┐
: │
: .cpp ==========> .obj ───┼→ .exe
: │
: .cpp ==========> .obj ───┘
: 如果你引入了一個 .cpp 的話 你的架構就會變成
: compile link
: .cpp ==========> .obj ───┐
: │
: .cpp ==========> .obj ───┴→ .exe
: ↑include
: .cpp
: 原本是互相對等的各個 .cpp 出現了包含的情形
: 雖然程式一樣可以 compile 可以跑
: 但架構上有一個 .cpp 和別人不一樣就是怪怪的
: 而且萬一一不小心把那個 .cpp 也當做一個 compilation unit 的話
: compile link
: .cpp ==========> .obj
: .cpp ==========> .obj
: ↑include >→相同名字的東西在不同的 compilation unit 出現
: .cpp ==========> .obj 容易有 link error
: 因為 linker 不知道這名字到底是指哪一個
: (linker 並不會知道它們其實是一樣的東西)
答案上面兩篇都有提過了。 以上恕刪部份
從別的角度來看,觀察一下一些 linux的 source code的header檔
裡面的變數,幾乎都是 static、extern的變數,而不會看到 int variable;
====================
你的這個header檔,只被1個.c檔include,自然沒問題,但機會很小
只要被2個以上的.c檔include,就會linker error,原因上一篇有提到(圖解很棒)
深入一點來看
站在compiler的角度來看,我就把foo翻成_foo,自然沒問題,沒理由擋你
但站在linker來看,它想把全部obj檔link起來的話,看到多個_foo當然會叫
有遇過考題,考說 .h檔內寫個int a; 被a.c b.c include 請問會如何 怎麼解決
1. 過的了沒問題 2. compiler過不了 3. linker過不了
自然就是用 static解 or extern
另外,其實這問題就等同於在同一個c project裡,兩個.c檔都寫 int a; 一樣
就是multiple defination
以上都是用c的角度去看,會有這問題。
以c++來說,習慣上,variable、function都會被class封裝起來,就不會這問題
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.114.79.168
※ 編輯: motocyman 來自: 140.114.79.168 (06/09 13:44)
※ 編輯: motocyman 來自: 140.114.79.168 (06/09 13:55)
→ loveme00835:補充~ C++ 也可以用namespace 來封裝變數 06/09 16:39
推 loveflames:anonymous namespace比較好,因為是external linkage 06/09 17:43
→ loveflames:可以用在non-type template 06/09 17:44