assert宏主要是在程序调试版本中使用,这里总结了关于assert和assert_perror的使用方法和一些关键问题和考虑。
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。
# define assert(expr) \ ((expr) \ ? __ASSERT_VOID_CAST (0) \ : __assert_fail (__STRING(expr), __FILE__, __LINE__, __ASSERT_FUNCTION))
# define assert(expr) (__ASSERT_VOID_CAST (0))
assert_perror的作用是根据errnum向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。
# define assert_perror(errnum) \ (!(errnum) \ ? __ASSERT_VOID_CAST (0) \ : __assert_perror_fail ((errnum), __FILE__, __LINE__, __ASSERT_FUNCTION))
# define assert_perror(errnum) (__ASSERT_VOID_CAST (0))
/usr/include/errno.h --> /usr/include/bits/errno.h --> /usr/include/linux/errno.h --> /usr/include/asm/errno.h --> /usr/include/asm-generic/errno.h 错误码:35~131 --> /usr/include/asm-generic/errno-base.h 错误码:1~34
注:在/usr/include/asm-generic/errno-base.h中前面几个错误码定义如下,其中错误码1为 Operation not permitted,后续测试代码将会用到这个错误码:
assert调试函数考虑的几个问题:
这里给出一个简单用例,给出如何使用assert和assert _perror函数的使用方法:
void test_assert(void *p) { assert(NULL != p); printf("%s, %d, %s -> [p = 0x%x].\r\n", __FILE__, __LINE__, __func__, (unsigned int)p); } void test_assert_perror(int err) { assert_perror(err); printf("%s, %d, %s -> [p = 0x%x].\r\n", __FILE__, __LINE__, __func__, err); }
demo测试main函数代码(0:测试test_assert; 1:测试test_assert_perror):
int main(int argc, char *argv[]) { int i; if (2 != argc) { Help(argv[0]); return -1; } i = atoi(argv[1]); switch(i) { case 0: test_assert(1); test_assert(NULL); break; case 1: test_assert_perror(0); test_assert_perror(1); break; default: Help(argv[0]); return -2; } return 0; }
5) 有的地方,assert不能代替条件过滤,因为assert仅作用于DEBUG版本。(如果这么做,会使用程序在真正运行时遇到问题。)
参考文档:
【1】assert用法总结