標籤

C++ (12) Linux (6) MacOSX (4) Makefile (3) Matlab (3) Ubuntu (3) Android (2) C (1) Refactoring (1)

2011年12月22日 星期四

[C++] header, static and compilation

自己做研究寫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年11月13日 星期日

[c++] 資料結構ADT之容易Crash的點

每次建新的class時
都很開心地寫了一堆member function
結果function明明就沒有問題
可是一用就segmentation fault (囧)
而且通常也cout不出個所以然...
(當然也是可以用gdb啦...)

下面列了幾個很容易crash的點:

<狀況一> 忘了寫copy constructor 和 operator =

2011年11月12日 星期六

[MacOSX] vim裡的Home和End

一直無法在vim裡用Home和End
快被搞死了

最後查到把下面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喔

2011年11月9日 星期三

[Matlab] Property Editor 圖片編輯

如果你是第一次使用simulink的話
應該會發現在simulink裡所有的scope
不論是一般的(time-domain) scope、spectrum scope或是PSD scope
開啟的圖片不但不能編輯
連存檔都有點困難(還要用printscreen = =)

要解決這個問題其實很簡單