您的位置:首页 > 编程语言 > C语言/C++

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

2012-05-17 14:33 239 查看
第六章
在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%的代码用于实现错误检测和错误处理。想想自己写过的代码要么没有错误检测和处理,要么仅有简单的错误检测。无地自容呐。异常处理学了很长时间,竟然在实际开发没有使用过,这是不应该的,这一次一定得从这上面下功夫。
异常机制提供程序的错误检测与错误处理部分之间的通信。有标准库定义的一组异常类用来在throw和catch之间传递有关的错误信息。
try引入局部作用域,在{}定义的变量不能再try块外引用。
要让程序所包含的代码仅在开发过程中执行,当程序完成准备交付就会将调试代码关闭。这可以使用_DEBUG和NDEBUG预处理变量来实现。
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断言就会被执行。如定义NDEBUG,assert将不被执行。
这里要将NDEBUG与vc中的_DEBUG区别开。VC定义_DEBUG有其用途, 它控制其它宏比如 _ASSERT的行为, 但与assert 无关。assert是ANSI C标准的断言宏,_ASSERT是VC提供的众多断言相关的宏中的一个。虽然做Windows下开发的会注意到VC编译选项Release版都有一个NDEBUG宏, 但这个宏的引入不是微软特定的。而是在ANSI C中定义的。在vs中使用debug模式,默认情况下将定义_DEBUG。使用release模式,默认情况下将定义NDEBUG。
标准ANSI C还定义了其余4个在调试中非常有用的常量, 这些常量在debug和release模式下均可使用。
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: