C语言中do...while(0)的妙用-避免goto
使用goto的优雅并避免结构的混乱 
将要跳转到的语句用do{…}while(0) 包起来就可以。
 #defien N 10
 bool Execute()
 {
    // 分配资源
    int *p = (int *)malloc(N * sizeof(int));
    bool bOk = true;
    // 运行并进行错误处理
    bOk = func1();
    if(!bOk)
    {
       free(p);
       p = NULL;
       return false;
    }
    bOk = func2();
    if(!bOk)
    {
       free(p);
       p = NULL;
       return false;
    }
    bOk = func3();
    if(!bOk)
    {
       free(p);
       p = NULL;
       return false;
    }
    // ..........
    // 运行成功,释放资源并返回
     free(p);
     p = NULL;
     return true;
 }
#defien N 10
 bool Execute()
 {
    // 分配资源
    int *p = (int *)malloc(N * sizeof(int));
    bool bOk = true;
    // 运行并进行错误处理
    bOk = func1();
    if(!bOk) goto errorhandle;
    bOk = func2();
    if(!bOk) goto errorhandle;
    bOk = func3();
    if(!bOk) goto errorhandle;
    // ..........
    // 运行成功,释放资源并返回
     free(p);
     p = NULL;
     return true;
     errorhandle:
     free(p);
     p = NULL;
     return false;
 }
#defien N 10
 bool Execute()
 {
     //分配资源
     int *p = (int *)malloc(N * sizeof(int));
     bool bOK = true;
     do {
         //运行并进行错误处理
         bOK = fun1();
         if(!bOK) break;
         bOK = fun2();
         if(!bOK) break;
         bOK = fun3();
         if(!bOK) break;
         //.........
     }  while(0);
     //释放资源
     free(p);
     p = NULL;
     return bOK;
 }
C语言中do...while(0)的妙用-避免goto的更多相关文章
- C语言中do...while(0)的妙用(转载)
		
转载来自:C语言中do...while(0)的妙用,感谢分享. 在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 1.避免goto语 ...
 - C语言中do...while(0)的妙用
		
在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 1.避免goto语句: 通常,如果一个函数开始要分配一些资源,然后如果在中途遇到错 ...
 - C/C++语言中NULL、'\0’和0的区别
		
注:本文参考了http://blog.csdn.net/mylinx/article/details/6873253及书籍<征服C指针>([日]前桥和弥著). NULL.'\0'和0的值是 ...
 - R语言中的logical(0)和numeric(0)以及赋值问题
		
logical(0) 不等于 numeric(0).两者都不等于NULL值,即is.null(logical(0))和is.null(numeric(0))返还值都是FALSE.这很有意思,说明长度为 ...
 - C语言中do...while(0)用法小结
		
在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个: 本文地址:http://www.cnblogs.com/archimedes/p/ ...
 - 请问:c语言中d=1/3*3.0;与d=1.0/3*3;d=?有什么区别
		
请问:c语言中d=1/33.0;与d=1.0/33;d=?有什么区别 d=1/33.0; 这时d=0,d=(1/3)3.0,这里1是整形,1/3也是整形,等于0,所以03.0=0 d=1.0/33; ...
 - C语言中,头文件和源文件的关系(转)
		
简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句, ...
 - C 语言中 setjmp 和 longjmp
		
在 C 语言中,我们不能使用 goto 语句来跳转到另一个函数中的某个 label 处:但提供了两个函数——setjmp 和 longjmp来完成这种类型的分支跳转.后面我们会看到这两个函数在处理异常 ...
 - C语言中qsort函数用法
		
C语言中qsort函数用法-示例分析 本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...
 
随机推荐
- appium安卓自动化常见问题处理
			
appium安卓自动化常见问题处理 1.seesionnotcreatedexception 遇到这个首先确定下jdk需要1.7以上 然后还要确定appium是启动状态,可以cmd重启下appium ...
 - 【转】MapReduce读取lzo文件
			
1.读lzo文件 需要添加以下代码,并导入lzo相关的jar包 job.setInputFormatClass(LzoTextInputFormat.class); 2.写lzo文件 lzo格式默认是 ...
 - 查看JSTL的doc解决问题
			
感觉JSTL这些东西的API远比java的api难找多了,不过终究是有办法的,google:jstl documentation,进入http://docs.oracle.com/javaee/5/j ...
 - tomcat 8 加 struts2的 java.lang.NoSuchFieldException: resourceEntries
			
google发现已经有人把这个bug提交给了apache,issue地址,具体原因就是 Tomcat8 introduce super class WebappClassLoaderBase and ...
 - eclipse 集成 github
			
1.eclipse markketplace 搜索 egit 安装 next next ........ 安装好之后restart 2.开始配置git插件 配置git有2中方式 1.使用http ...
 - 成果展示-RSA算法工具
 - C#类的修饰符
			
## C#类的修饰符------------------------- public 任何地方可以调用- internal 同一应用程序集内使用- partial 部分类,一个类分成几部分写在不同文件 ...
 - 【C++程序员学 python】python 之helloworld
			
我学习C语言之后才学的C++,所以这里写一个简单的helloworld程序. #coding:utf-8 def main(): print "hello world" if __ ...
 - [3G/4G]3G/4G模块开发
			
转自:http://mywutuobang.blog.sohu.com/260073467.html 一. 修改内核支持3G模块,一般内核需要枚举相关的通讯模块,其接口为串口,其数据接口和通讯接口枚举 ...
 - R语言两种方式求指定日期所在月的天数
			
R语言两种方式求指定日期所在月的天数 days_monthday<-function(date){ m<-format(date,format="%m& ...