自己做研究寫c++時
如果檔案一多起來
Makefile就變得很重要
通常程式還算小的話
只要搭配#include guards用#ifndef, #define, #endif
並把每個class的宣告(Prototypes, Definition)寫在.h檔
把實作的部分寫在.cpp檔裡
用makefile把所以class都分別compile在用link起來就沒啥問題了
但class小的時候
把宣告跟實作分別寫在.h和.cpp檔真的頗為麻煩
尤其當class只是簡單container沒啥功能時
撰寫cpp檔更是顯得很冗又很繁瑣
用#include其實就是把檔案先直接嵌入
再行編譯
所以如果有任何的初始化(initialization)出現在.h檔裡
那該.h檔就只能被一個.cpp程式引用
因為當有同時有兩個.cpp引用的該header
則兩個cpp檔都會做相同的初始化動作
這會導致最後一步link所有cpp檔編譯完的.o檔時
產生變數名稱衝突的問題
簡單來說就是相當於一樣的變數名被宣告兩次
避免發生這問題有幾個方法:
1) 不要在.h檔裡初始化,這樣就不會在多個檔案被allocated
2) 如果一定要在.h檔裡初始化,那就確保該.h檔只被一個.cpp檔引用
參考來源:
http://stackoverflow.com/questions/2470737/why-cant-initialize-the-static-member-in-a-class-in-the-body-or-in-the-header-f
2011年12月22日 星期四
2011年11月13日 星期日
[c++] 資料結構ADT之容易Crash的點
每次建新的class時
都很開心地寫了一堆member function
結果function明明就沒有問題
可是一用就segmentation fault (囧)
而且通常也cout不出個所以然...
(當然也是可以用gdb啦...)
下面列了幾個很容易crash的點:
<狀況一> 忘了寫copy constructor 和 operator =
都很開心地寫了一堆member function
結果function明明就沒有問題
可是一用就segmentation fault (囧)
而且通常也cout不出個所以然...
(當然也是可以用gdb啦...)
下面列了幾個很容易crash的點:
<狀況一> 忘了寫copy constructor 和 operator =
2011年11月12日 星期六
[MacOSX] vim裡的Home和End
一直無法在vim裡用Home和End
快被搞死了
最後查到把下面8加到~/.vimrc裡就ok了
快被搞死了
最後查到把下面8加到~/.vimrc裡就ok了
map <Esc>[H <Home> imap <Esc>[H <Home> map <Esc>[F <End> imap <Esc>[F <End> map <Esc>[5~ <PageUp> imap <Esc>[5~ <PageUp> map <Esc>[6~ <PageDown> imap <Esc>[6~ <PageDown>資料來源:http://serverfault.com/questions/73013/vim-keyboard-remap-on-snow-leopard-macos-10-6
2011年11月10日 星期四
[ctags] 在Mac OS X下配合Vim
直接去抓ctags-5.7.tar.gz
下載完後用tar zxvf解壓縮
接著./configure && make all && sudo make install
最後最後
也是最重要的一步
因Mac OS X下本來就有安裝另一種ctags
所以記得在開啟Terminal時要更改$PATH
export PATH="/usr/local/bin:$PATH"
這樣使用時才會真正執行我們想要安裝的ctags喔
下載完後用tar zxvf解壓縮
接著./configure && make all && sudo make install
最後最後
也是最重要的一步
因Mac OS X下本來就有安裝另一種ctags
所以記得在開啟Terminal時要更改$PATH
export PATH="/usr/local/bin:$PATH"
這樣使用時才會真正執行我們想要安裝的ctags喔
2011年11月9日 星期三
[Matlab] Property Editor 圖片編輯
如果你是第一次使用simulink的話
應該會發現在simulink裡所有的scope
不論是一般的(time-domain) scope、spectrum scope或是PSD scope
開啟的圖片不但不能編輯
連存檔都有點困難(還要用printscreen = =)
要解決這個問題其實很簡單
訂閱:
文章 (Atom)