首页 热点专区 义务教育 高等教育 出国留学 考研考公

assert问题,C语言

发布网友 发布时间:2022-04-25 10:38

我来回答

4个回答

热心网友 时间:2024-12-11 00:16

#ifdef __cplusplus
extern "C" { /*如果定义了cplusplus标识符就加个括号,表示是一个外部的C函数*/
#endif

#undef assert /*取消定义assert标识符*/

#ifdef NDEBUG /*如果定义NDEBUG标识符,就启用下面的语句*/
#define assert(exp) ((void) 0) /*用(void) 0来替换assert函数定义,实际是取消assert函数功能,因为void 0不会生成任何语句*/

#else /*否则的话*/
void CVIANSI _assert(char *, char *, int); /*引入系统函数_assert的定义*/

#define assert(exp) ((exp) ? (void) 0 : _assert(#exp, __FILE__, __LINE__))
/*用 ((exp) ? (void) 0 : _assert(#exp, __FILE__, __LINE__))替换assert(exp)函数定义*/
/*替换后作用是如果exp为真,则执行(void) 0不生成任何语句,如果为假,则执行_assert语句*/
/*_FILE_,_LINE_是编译器常数,编译器在这一句中会将当前源程序的行数和文件名当做函数的参数放到语句中去,然后再编译这个语句*/
#endif

#ifdef __cplusplus
}
#endif

#endif /* _ASSERT_H_ */

热心网友 时间:2024-12-11 00:17

assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,
  然后通过调用 abort 来终止程序运行。

热心网友 时间:2024-12-11 00:13

关键是看 这句#define assert(exp) ((exp) ? (void) 0 : _assert(#exp, __FILE__, __LINE__))
1,如果 exp为真,则返回0,不进行任何操作。
2,如果exp为假,则调用_assert(#exp, __FILE__, __LINE__)
_assert(#exp, __FILE__, __LINE__) 就是打印 assert断言的内容: 主要是 exp的字符串, 当前文件的名字, 当前行数。

热心网友 时间:2024-12-11 00:13

就是一些预编译命令,根据字面意思就能理解
如:如果定义了宏__cplusplus,产生代码:

extern "C" {
。。。。。
}
#ifndef _ASSERT_H_
#define _ASSERT_H_
就是如果 _ASSERT_H_ 没有被定义,就定义一个

关于assert
 宏名: assert
  功 能: 测试一个条件并可能使程序终止
  用 法: void assert(int test);
如 assert(nNewSize >= 0);
  assert(nNewSize <= MAX_BUFFER_SIZE);

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com