小明思考

高性能服务器端计算
posts - 70, comments - 428, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

漫谈函数的返回值

Posted on 2006-04-25 16:55 小明 阅读(2377) 评论(2)  编辑 收藏 引用 所属分类: C/C++
在windows的世界里面,很少有API没有返回值。但是到底返回什么代表成功,这个没有标准。我发现主要有三种模式

1 . 返回非0表示成功,返回0表示失败

大多数Win32 Platform API都是这样,比如

int result =MoveFileEx(szTempName, 
                    
"allcaps.txt"
                    MOVEFILE_REPLACE_EXISTING);

if(!result)
    { 
        printf(
"Could not move file. error:%d",GetLastError());
        
return 0;
    }

使用这种方法。你必须提供类似GetLastError的取错误的方法,而且你必须保证这个函数是thread-safe的,每个线程能维护自己的错误信息。

2. 返回大于等于0表示成功,返回-1表示失败
socket api大部分是这样设计的

while( bytesRecv != SOCKET_ERROR ) {
    bytesRecv 
= recv( ConnectSocket, recvbuf, 320 );
    
if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
      printf( 
"Connection Closed.\n");
      
break;
    }
    printf( 
"Bytes Recv: %ld\n", bytesRecv );
  }

这样的好处是返回值就可以用来表示成功和状态。比如这里的recv就可以返回收到的字节数。但是你还是要有一个查询错误的API,like WSAGetLastError().

3.返回0表示成功

COM的接口大部分是这样设计的
if( FAILED(lpdd->QueryInterface(IID_IDirectDraw7, (LPVOID *&lpdd)))
    {
          
//error handle and return
    }





其他的一些考虑

1.如何定义错误值?
简单的一点使用宏连续定义,like
#define E_NO_FILE 1
#define E_BAD_FILE 2
复杂的一点就像COM,严格的定义每一位的意义
这种情况下你可以提供一个宏来创建错误代码,like
#define MAKE_HRESULT(sev,fac,code)\

( (HRESULT) (((unsigned 
long)(sev)<<31| ((unsigned long)(fac)<<16) \

| ((unsigned long)(code))) )

2.可以提供一个宏或者函数来帮助判断是否成功
比如COM提供了FAILED宏来帮助你判断COM的返回值
#define FAILED(Status)     ((HRESULT)(Status)<0)

3.如果只有错误和成功两个返回值,考虑使用bool来返回
这个适用于C++,优点是意义很清晰.返回 true就是成功,false就是失败.

4.要使用异常来表示错误的状态么?
使用异常的好处就是返回值被省出来了,可以不返回或者返回其他信息,还有益于定义错误类型和简化程序流程。缺点就是C++对异常支持还不够好,没有finally,每一家编译器支持也不一样,实现可能大不同.

Feedback

# re: 漫谈函数的返回值  回复  更多评论   

2006-04-25 18:05 by <font color="#FF00FF" >Stone Jiang
如果是像
isEmpty()这样的函数,返回非0表示真,返回0表示假

像用于框架底层,操作(函数调用)失败需要将错误原因抛向调用层(直到在UI中显示出相关状态信息)时,返回0表示成功,非0表示失败.

以上是我期望的"统一"的方式.呵呵

# re: 漫谈函数的返回值  回复  更多评论   

2006-05-03 23:01 by 史传红
@&lt;font color=&quot;#FF00FF&quot; &gt;Stone Jiang
希望是这样的.

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理