C++ primer第二次阅读学习笔记(第6章)

长平狐 发布于 2012/10/08 15:16
阅读 81
收藏 0

 第六章

switch中只有在最后一个case或是default语句之后才能定义变量,之所以这样规定是为了避免代码跳过变量定义和初始化。

switch(val)

{

  case xx:

     break;

  case yy:

     int i;//错误,该变量会在块结束之前一直存在,此后的case              

                       //default都可以使用i;如果语句跳过yy执行后面

               //的语句则i就出现未定义就使用的情况。

    break;

     case zz:

     i++;   

     break;  

     default:

          i--;

         break;

}

为了解决这种情况,可以为每个case语句添加{}花括号,引入块语句,在该块定义的变量只能在该语句块中使用。

对于do while循环

do
   {

  cal(foo);

}while(int foo==val());

此句是错误的。

也不可以以下情况

do

{

  int foo=90;//跳出{}foo就不复存在了。

}while(foo==val)

令人不可思议的是在交换机和路由器这些长时间运行的交互式系统90%的代码用于实现错误检测和错误处理。想想自己写过的代码要么没有错误检测和处理,要么仅有简单的错误检测。无地自容呐。异常处理学了很长时间,竟然在实际开发没有使用过,这是不应该的,这一次一定得从这上面下功夫。

异常机制提供程序的错误检测与错误处理部分之间的通信。有标准库定义的一组异常类用来在throwcatch之间传递有关的错误信息。

try引入局部作用域,在{}定义的变量不能再try块外引用。

要让程序所包含的代码仅在开发过程中执行,当程序完成准备交付就会将调试代码关闭。这可以使用_DEBUGNDEBUG预处理变量来实现。

NDEBUG是在ANSI C中定义的。

int main(int argc,char**argv)

{

  # ifndef  NDEBUG

    cerr<<"starting main"<<endl;

   #endif

}

如果NDEBUG未定义程序就会将错误信息写到cerro中,如果NDEBUG已定义,程序运行时将会跳过#ifndef#endif

默认情况下NDEBUG未定义,也就意味着#ifndef#endif之间的代码必须执行。

如果NDEBUG未定义assert断言就会被执行。如定义NDEBUGassert将不被执行。

这里要将NDEBUGvc中的_DEBUG区别开。VC定义_DEBUG有其用途它控制其它宏比如 _ASSERT的行为但与assert 无关。assertANSI C标准的断言宏,_ASSERTVC提供的众多断言相关的宏中的一个。虽然做Windows下开发的会注意到VC编译选项Release版都有一个NDEBUG但这个宏的引入不是微软特定的。而是在ANSI C中定义的。在vs中使用debug模式,默认情况下将定义_DEBUG。使用release模式,默认情况下将定义NDEBUG

标准ANSI C还定义了其余4个在调试中非常有用的常量这些常量在debugrelease模式下均可使用。

1__FILE___文件名

2__LINE__行号

3__TIME__文件被编译时间。

4__DATE__文件被编译的日期。

assert是在casset头文件定义的,它有点想函数调用,需要一个表达式作为它的条件,如assert(i>j),如果i>j为真,则不做任何操作,若i>j为假,assert输出信息并且终止程序的执行。在vs中微软定义了_ASSERT断言功能与assert相同。

以下为对以上介绍的代码测试,可以帮助更好的理解。

	#include<iostream>
	#include<cassert>
	using namespace std;
	int main(int argc,char**argv)
	{
	#ifndef _DEBUG
	
		cerr<<"_DEBUG 没有定义!!"<<endl;
	#else
		cerr<<"_DEBUG已定义!!"<<endl;
	#endif
	#ifdef NDEBUG
		cerr<<"现在是release模式"<<endl;
	#else
		cerr<<"现在debug模式"<<endl;
	#endif
		cout<<"当前文件名为"<<__FILE__<<endl;
		cout<<"当前行号为"<<__LINE__<<endl;
		cout<<"编译 日期为"<<__DATE__<<endl;
		cout<<"编译时间为:"<<__TIME__<<endl;
		int a=0,b=1;
		assert(a);
		_ASSERT(b);
		return 0;
	}


在vc的debug模式下的运行结果为:

在release模式下的运行结果为:

a


原文链接:http://blog.csdn.net/ithzhang/article/details/7576288
加载中
返回顶部
顶部