2010/11/7
關鍵字:使用預編譯器進行調試
預編譯變量
C++標準
#ifndef NDEBUG
//...
#endif
VC8編譯器
#ifdef _DEBUG
//...
#endif
其他預編譯變量:__FILE__、__LINE__、__TIME__、__DATE__
assert
另一種調試技術是assert(斷言)預處理宏(preprocessor macro),assert在cassert頭文件中定義.
只要NDEBUG未定義,assert宏就求解表達式的expr,如果結果爲false,assert輸出信息並終止程序的執行.如果該表達式有一個非0值(負值也可以),則assert不做任何操作.
assert在定義了NDEBUG時不做任何工作,因此也沒有任何運行時代價.assert僅用於檢查確實不可能的條件,這隻對程序的調試有幫助,但不能用來代替運行時的檢查邏輯,也不能代替對程序產生錯誤的檢測.
string str = "123";
assert(str.size()); //調試通過,realse運行時不執行
assert(-1.0f); //調試通過,realse運行時不執行,只要不爲就通過
assert(0); //調試報錯,realse運行時不執行
函數零散知識點
1. const形參表示在函數體作用域中,形參不能被修改.形參是在調用函數時被實參初始化的局部變量,所以實參既可以是const類型,也可以是普通的變量,也可以是常量表達式.
void func(const int i) //等同於void func(int i)
{
}
int _tmain(int argc, _TCHAR* argv[])
{
func(1); //常量,OK
int i = 0;
func(i); //普通變量,OK
const int j = 0;
func(j); //const變量,OK
return 0;
}
C中具有const形參的函數和非const形參的函數並無區別.爲了支持對C的兼容,C++中也是將const形參視爲普通形參類型.這也是不能用const形參區別重載函數的原因.
2. 引用做形參.
void func(int &i)
{
i = 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
short i = 0;
int *j = reinterpret_cast<int*>(&i);
func(*j); //ok,func會改變i的值,調用函數時並未轉換
func(i); //error,需要類型轉換的對象不可以
func(0); //error,常量表達式不可以
func(z1 + z2); //error,右值不可以
return 0;
}
引用做形參時,傳遞右值、需要轉換的類型對象都是不可以的.