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

第六章

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

switch(val)

{

casexx:

break;

caseyy:

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

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

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

break;

casezz:

i++;

break;

default:

i--;

break;

}

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

对于dowhile循环

do
{

cal(foo);

}while(intfoo==val());

此句是错误的。

也不可以以下情况

do

{

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

}while(foo==val)

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

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

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

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

NDEBUG是在ANSIC中定义的。

intmain(intargc,char**argv)

{

#ifndefNDEBUG

cerr<<"startingmain"<<endl;

#endif

}

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

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

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

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

标准ANSIC还定义了其余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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值