我谈windows函数的返回值规律
来源:互联网 发布:数据库原理 pdf 网盘 编辑:程序博客网 时间:2024/06/07 23:29
在windows的世界里面,很少有API没有返回值。但是到底返回什么代表成功,这个没有标准。我发现主要有三种模式
1 . 返回非0表示成功,返回0表示失败
大多数Win32 Platform API都是这样,比如
使用这种方法。你必须提供类似GetLastError的取错误的方法,而且你必须保证这个函数是thread-safe的,每个线程能维护自己的错误信息。
2. 返回大于等于0表示成功,返回-1表示失败
socket api大部分是这样设计的
这样的好处是返回值就可以用来表示成功和状态。比如这里的recv就可以返回收到的字节数。但是你还是要有一个查询错误的API,like WSAGetLastError().
3.返回0表示成功
COM的接口大部分是这样设计的
其他的一些考虑
1.如何定义错误值?
简单的一点使用宏连续定义,like
这种情况下你可以提供一个宏来创建错误代码,like
2.可以提供一个宏或者函数来帮助判断是否成功
比如COM提供了FAILED宏来帮助你判断COM的返回值
3.如果只有错误和成功两个返回值,考虑使用bool来返回
这个适用于C++,优点是意义很清晰.返回 true就是成功,false就是失败.
4.要使用异常来表示错误的状态么?
使用异常的好处就是返回值被省出来了,可以不返回或者返回其他信息,还有益于定义错误类型和简化程序流程。缺点就是C++对异常支持还不够好,没有finally,每一家编译器支持也不一样,实现可能大不同.
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;
}
"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, 32, 0 );
if ( bytesRecv == 0 || bytesRecv == WSAECONNRESET ) {
printf( "Connection Closed.\n");
break;
}
printf( "Bytes Recv: %ld\n", bytesRecv );
}
bytesRecv = recv( ConnectSocket, recvbuf, 32, 0 );
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
}
{
//error handle and return
}
其他的一些考虑
1.如何定义错误值?
简单的一点使用宏连续定义,like
#define E_NO_FILE 1
#define E_BAD_FILE 2
复杂的一点就像COM,严格的定义每一位的意义#define E_BAD_FILE 2
这种情况下你可以提供一个宏来创建错误代码,like
#define MAKE_HRESULT(sev,fac,code)\
( (HRESULT) (((unsigned long)(sev)<<31) | ((unsigned long)(fac)<<16) \
| ((unsigned long)(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,每一家编译器支持也不一样,实现可能大不同.
- 我谈windows函数的返回值规律
- windows 内核函数命名规律
- Windows 的GetLastError()函数返回值之含义
- 函数的返回值
- 函数的返回值
- 函数的返回值
- 函数的返回值
- 函数的返回值
- 函数的返回值
- windows下system函数返回值
- 我能用Windows PowerShell做什么:过滤返回的数据
- 这篇文章,我主要是想看看 oracle单值函数的返回值
- 我与python约个会:15编程进阶~函数的返回值
- 函数返回值的疑问
- 函数返回值的问题
- 函数的引用返回值
- 返回指针值的函数
- 有返回值的函数
- c4.5算法
- C++变量类型
- IOS开发调用系统相机和打开闪光灯
- Unity在SVN版本管理里的配置
- Android ListView 指定显示最后一行
- 我谈windows函数的返回值规律
- vim删除行尾的空格
- ubuntu中VNC的安装配置笔记
- Poj -题目分类
- Unity3D学习笔记05:四元数控制人物旋转
- ajax表单验证
- 说2013年搜索引擎的发展趋势
- sqlserver 自定义函数
- 如何欣赏音乐(一)