2010/11/7

2010/11/7

關鍵字:使用預編譯器進行調試

 

預編譯變量

C++標準

#ifndef NDEBUG

    //...

#endif

VC8編譯器

#ifdef _DEBUG

    //...

#endif

 

其他預編譯變量:__FILE____LINE____TIME____DATE__

assert

另一種調試技術是assert(斷言)預處理宏(preprocessor macro),assertcassert頭文件中定義.

只要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;

}

引用做形參時,傳遞右值、需要轉換的類型對象都是不可以的.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章