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;

}

引用做形参时,传递右值、需要转换的类型对象都是不可以的.

你可能感兴趣的:(2010/11/7)