函数返回值的问题_dreamzqw的博客-程序员宅基地

技术标签: C/C++  c  windows  

 
函数返回问题
一个应用系统要正确稳写地运行,必须要对各个函数的返回值进行正确的判断,若函数没有正确的持行,而上层应用又没有进行错误处理的话,程序很有可能进入到一个不确写的状态。从而导至系统的不稳定,那么当一个函数没有正确持行时,应当怎样返回才能使上层调用方便地知道函数没有正确持行而进行错误处理呢,又要怎样才能使错误处理代码简单而有效呢。
方案一:若函数成功返回,则返回一个正值,错误时返回一个负值。
如:return i (函数成功返回) return –ERR(函数出错时返回)。
在方案一中,有如下二个问题:
1.          若某个函数的正确返回值为负时(如一个数学运算函数)则上层调用就不能用if (返回值<0) {出错处理}来判断。
2.          若函数的返回值为无符号型,则这样的函数不能返回一个负值。(如一个返回整型的句柄函数)。
方案二:函数的返回值为布尔型。成功调用时返回“TRUE”,错误时返回“FALSE”,再用一个指针指向出错的具体原因。如函数声明:BOOL Funcation(int a,char b,int* err);其中第三个参数“int *err”可以指向一个int 型的变量,我们可以用它来指明错误的具体原因。
如:BOOL Funcation(int a,char b,int* err)
{
       if(a输入参数错误)
       {
              *err=参数错误宏定义;
              Return FALSE;
}
……
}
这样的话,当上层函数调用这个函数时若返回值为FALSE,则可从err变量中读出具体的出错原因。
如:
BOOL TestFuncation(void)
{
       int err;
       if(FALSE==Funcation(1,c,&err))
       {
              //函数Funcation 调用出错
              Switch(err)
              {
                     Case …    //错误处理
}
}
}
方案二中每次在调用函数前都要声明一个用于获取函数调用错误的指针,且函数的参数要增加一个。而对于一些已经定义好的函数,如Windows 下的创建线程函数CreateThread(),就不可以再增加一个参数用于获取具体的错误原因。
方案三:当下层函数调用出错时,可以有另一个函数(如:GetLastERR( ))读出错误的具体原因。则调用一个函数时用如下语句:
BOOL TestFuncation(void)
{
       if(FALSE==Funcation(1,2))//函数调用出错
       {
              Switch(GetLastERR())//读出并判断出错原因
              {
                     Case ……//错误处理
}
}
}
方案三中,要实现GetLastERR()函数,就必需要一个全局变量用于存放函数最后一次出错的原因。这样会使一个设计中的全局变量增多。
其实现过程如下程序段:
int errfalg //定义一个全局变量,用于存放最后一次出错的原因
BOOL Funcation(int a,int b)
{
       if(a输入参数错误)
       {
       Errfalg=参数错误宏定义;
       Return FALSE;
}
……
}
int GetLastERR(void)
{
       return errfalg;
}
 
2006年11月2日星期四
周群威
 
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dreamzqw/article/details/1768350

智能推荐

Jsf中实现文件的下载注意的问题_gaojie1190的博客-程序员宅基地

1、关于jsf文件的的下载,其实现类很简单,关键是应用需要注意的问题很多,下面是文件下载的通用类package com.cvicse.report.ui.viewer.jsf.template;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java...

weblogic 启动报错bea 000386解决方案_gaofenghaha2的博客-程序员宅基地_weblogic bea-000386

weblogic 启动报错bea 000386原因:weblogic 用户名/密码验证认证失败解决方法:第一步:删除server 下对应节点服务boot.properties 文件 目录:/weblogic/Oracle/Middleware/user_projects/domains/base_domain/servers/Server2(对应你的节...

android播放器录制视频,Android播放器的录制实践_weixin_39789042的博客-程序员宅基地

播放录制是在观众端录制视频内容存至本地。观众对观看内容非常感兴趣想要将该视频内容留存至本地时便可使用该功能。一. 可行的方案在Android端实现播放录制的方法大约有下面三种:1. 录屏在Android 5.0 (API Level 21)及以上版本提供了录屏功能,使用系统提供的类MediaProjection与VirtualDisplay可实现在Android端的录制屏幕内容的功能,此处不再赘述...

mockjs的常用方法_面条请不要欺负汉堡的博客-程序员宅基地

一.mock.mock()根据数据模板生成模拟数据。更关键的是,我们发起Ajax请求的时候要能够接收到这些数据。这就是Mock.mock()的作用啦!Mock.mock( rurl?, rtype?, template|function( options ) )(1).参数的含义和默认值参数 rurl:可选。表示需要拦截的 URL,可以是 URL 字符串或 URL 正则。例如 /\/domain\...

Oracle script summary_cqhc56430的博客-程序员宅基地

sqlplus -S '/as sysdba' &lt; set echo on set serveroutput on alter database backup controlfile to trace as '/ho...

Oracle中查看所有表和字段以及表注释.字段注释_gaoshanliushui2009的博客-程序员宅基地

转自:http://www.cnblogs.com/xusir/p/3214714.htmlOracle中查看所有表和字段以及表注释.字段注释获取表:select table_name from user_tables; //当前用户拥有的表 select table_name from all_tables; //所有用户的表 select

随便推点

自己写自己的java.lang.Object会怎么样?_老高丶的博客-程序员宅基地

首先自己定义一个包叫做java.lang,然后在里面定义一个类叫做Object. 然后在里面定义一个方法叫做toString(),返回null.另一个叫sayHello()package java.lang;public class Object { public String toString() { return null; } public void sa

常用图像数据集大全(分类,跟踪,分割,检测等)_zhihua_bupt的博客-程序员宅基地

常用图像数据集大全(分类,跟踪,分割,检测等)1.搜狗实验室数据集:http://www.sogou.com/labs/dl/p.html互联网图片库来自sogou图片搜索所索引的部分数据。其中收集了包括人物、动物、建筑、机械、风景、运动等类别,总数高达2,836,535张图片。对于每张图片,数据集中给出了图片的原图、缩略图、所在网页以及所在网页中的相关文本。200多G

DE2-115 以太网通信之一88E1111网卡接收PC数据_weixin_30782331的博客-程序员宅基地

想利用手头上的DE2-115 写一个关于以太网通信的驱动,经过了这么多天的实验调试终于有了一些认识。1、我在观察网卡发送数据与接收数据的过程中发现,我从fpga上的一个网卡发送数据,然后另一个网卡接收数据,接收到的数据前面会有55h这8bit的数据。我从PC上发送数据,用fpga上的网卡接收数据,那么在接收到的数据前面会有55h,55h,55h,55h,55h,55h,55h,5dh这64bi...

软件设计师_gdl116929569的博客-程序员宅基地

转载于   http://blog.csdn.net/neicole/article/details/8437996我的中级软件设计师考试一开篇二个人软考原因对待软考or证书的态度三我的软考复习总体方法及计划时间安排四考点分布五具体考点及个人复习方法六结语加所想我的中级软件设计师考试 ―― 2012.12.25(By: Neicole

在ubuntu编译openjdk7(转载)_从此醉的博客-程序员宅基地

背景:因为之前学习openjdk的虚拟机系统,安装了emacs,导致环境编译出现问题。例如:这个问题,但不仅仅只有这一个。 虽然有安装之前有整个虚拟机完整的备份,但是正好趁此机会,再重新整理一遍编译过程。1. 环境信息 宿主操作系统:win7 professional 32位 vmware版本: vmware7 虚拟系统版本: Ubuntu10.10 32位 (English ...

Linux 内核代码风格--Kernel Coding Style(持续更新-20170616)_CHENG Jian的博客-程序员宅基地

CSDN GitHub kernel代码风格 LDD-LinuxDeviceDrivers/tree/study/pattern/code_style 本文创建日期 2017-06-16 10 : 55 基于Linux Kernel V4.11.5 英文原版 参见内核文档 Documentation/process/coding-style.rst 英文原

推荐文章

热门文章

相关标签