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 ...
随机推荐
- 李洪强iOS之集成极光推送三iOS集成指南
李洪强iOS之集成极光推送三iOS集成指南 SDK说明 适用版本 本文匹配的 SDK版本:r2.1.5 以后.查看最近更新了解最新的SDK更新情况.使用Xcode 6及以上版本可以使用新版Push S ...
- 终端模拟工具:Xshell 4
终端模拟工具:Xshell 4 2016-09-20 目录 1 安装 2 配置 3 命令 Xshell 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Window ...
- Windows2012R2版本区别
From:https://zh.wikipedia.org/wiki/Windows_Server_2012 Windows Server 2012有4种版本:Foundation, Essentia ...
- [转]采购文件中 RFI、RFQ、RFP、IFB的区别
原文:http://www.douban.com/group/topic/23426427/ [PMBOK的描述] 采购文件用于征求潜在卖方的建议书.如果主要依据价格来选择卖方(如购买商业或标准产品 ...
- Swif基础语法01
import Foundation /** * 1,第一个swift程序 */ println("Hello, World!") /** * 2,定义常量 */ let cIn ...
- hive 进阶笔记
-- mysql方式 create table account_channel(account_ String,channel_ String) as select a.account,b.chann ...
- Spring中@Resource与@Autowired
问题 这其实就是@Autoware与@Resource没有正确的使用,这个错误是因为wmPoiOplogService这个变量装配方式是@Resource,按照@Resource的按名字查找的方式,并 ...
- java定时任务Timer与ScheduledExecutorService<转>
在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现.下面LZ就其原理.实例以及Timer缺陷三个方面来解析java Timer定时器. ...
- ExtJS获取Grid的行数
1. grid.getSelectionModel().getCount() ; // 获得当前选中的行数 2. grid.getStore().getTotalCount(); ...
- linux防火墙开关以及端口规则添加
1. 重启后生效的 开启: chkconfig iptables on 关闭: chkconfig iptables off 2. 及时生效 开启: service iptables start 关闭 ...