網頁

2014年12月20日 星期六

Linux "2>&1 | tee build.log"

Last Update: 2014/12/20 16:21+08
Type: Note



make 2>&1 | tee build.log
不一定要是 make
是執行什麼東西就可以用

0: stdin, 1: stdout, 2: stderr
"2>&1": 將標準錯誤 重新定向到 標準輸出

"tee build.log": tee 將同時輸出到 控制台 和 build.log


C++ &(and) 與 const

Last Updat: 2014/12/20 15:03+08
Type: Note



測試 C++ 的 & 與 const

2014年12月19日 星期五

makefile .PHONY

Last Update: 2014/12/20 13:43+08
Type: Note



# makefile
gen:
 mkdir -p clean
clean:
 rm -rf clean
執行 "make gen ; make clean"
會生成 clean 的目錄, 但無法成功執行 clean 的命令
得到的錯誤訊息為 "make: `clean' is up to date."
因為 make 執行時, 會去搜尋該檔案或目錄是否存在
為了避免檔案目錄與命令的衝突 可以加下 .PHONY
# makefile
gen:
 mkdir -p clean

clean:
 rm -rf clean
.PHONY: clean
就可以成功執行了
像是宣告它是偽檔案/目錄的意思
也可以避免它花時間去搜尋



2014年12月13日 星期六

C++ vector - Pointer or Not

Last Update: 2014/12/13 20:13+08
Type: Note



Intro

當我們宣告一個 vector 時, 要用 Pointer 還是 不要用 比較好?
我覺得是要看個人使用習慣
雖然有人說用 new 出來的, 也就是用 Pointer 比較好
但其實只要瞭解它的運作, 別搞亂就可以了
需要注意的是 vector 在 超出它當前的容納量時, 會重新 宣告/要求 分配memory



2014年12月7日 星期日

C++ member declare has incomplete type

Last Update: 2014/12/08 13:42+08
Type: Note



class 宣告member時
若該member的型態並非指標
則該member的型態必需事先就定義完整
如下例, compile是會失敗的
class Personality;
class Human{
  Personality p;
}

class Personality{
  string name;
}
因為它必須先計算 Human class 的 memory 大小
但他卻還不知道 Personality class 的 size, 所以無從計算

如果改成指標型態 就沒有問題, 因為指標大小是固定的
class Personality;
class Human{
  Personality *p;
}

class Personality{
  string name;
}
在使用 include 時要注意這點
Java 和 C# 沒有這問題, 因為 class 都是以指標型態儲存



----------------------------------


實例上來看, 我們會像下面這樣宣告 形成不完全的型態
//Human.h
#ifndef HUMAN_H_
#define HUMAN_H_
#include "project.h"
class Human{
  Personality p;
}
#endif
//Personality.h
#ifndef PERSONALITY_H_
#define PERSONALITY_H_
#include "project.h"
class Personality{
  string name;
}
#endif
//project.h
#include "Human.h"
#include "Personality.h"
這就會導致上述提到的不完全型態
"#define PERSONALITY_H_" 後, 接著引入 project.h
此時的 Personality class 尚未宣告 or 尚未完成宣告
project.h 引入 Human.h
Human class 宣告, 但無法計算size, 因為 Personality class 未完成