前言:
对于函数,供别人调用,或自己内部调用,返回值可以传递很多信息,但返回值亦应该尽量简单明了的表达函数执行的结果或状态。
1. 定义通用的返回值
每个编写的函数,如果需要返回函数的执行结果或者状态,返回这些通用的值。
意义简单明了,而且通用。
这种类值的定义记得加注释或者从命名就能知道意义较好[关于更多代码命名和代码注释可以参考《代码大全》]。
例如:
/* Return value of the commands. */
#define CMD_SUCCESS 0
#define CMD_WARNING 1
#define CMD_ERR_NO_MATCH 2
#define CMD_ERR_AMBIGUOUS 3
#define CMD_ERR_INCOMPLETE 4
#define CMD_ERR_EXEED_ARGC_MAX 5
#define CMD_ERR_NOTHING_TODO 6
2. 失败或成功返回特定值,失败的错误码用全局变量保存
Linux 下的大多函数的采用的是返回 -1 代表失败, >= 0 代表成功,函数调用出现错误时,使用 errno 来标识遇到的错误。
错误码采用通用的宏
#define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
#define EINTR 4 /* Interrupted system call */
#define EIO 5 /* I/O error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Argument list too long */
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /* Bad file number */
#define ECHILD 10 /* No child processes */
#define EAGAIN 11 /* Try again */
#define ENOMEM 12 /* Out of memory */
失败返回 NULL[(void *) 0],成功则返回 非NULL 的地址值。
例如分配内存函数。
4.不返回值,直接结束进程
函数对于认为调用该函数或函数内部发生不可接受的错误时,此时的内部代码存在问题( BUG ),选择直接结束整个进程。
一般是采用 assert 或类似机制来下断言。
常用于参数的合法性检查和编写单元测试代码。
开源的单元测试库 CUnit 就会使用很多断言:
/** Simple assertion.
* Reports failure with no other action.
*/
#define CU_ASSERT(value) \
{ CU_assertImplementation((value), __LINE__, #value, __FILE__, "", CU_FALSE); }
也可以自己编写自己断言[关于断言,可以参考《C标准库》]
以上内容是阅读了开源项目 quagga(也称zebra)的某一处代码而写的感想,记录一下。
参考资料如下:
......
“网络是个神奇的东西”...