看板 C_and_CPP 關於我們 聯絡資訊
: 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