NVIDIA面试笔试题之一:

assert.h是c标准库的一个头文件,该头文件的主要目的就是提供一个assert的宏定义。

assert只是对所给的表达式求值,就像if判断语句中一样,然后如果该值为真则正常运行,否则报错,并调用abort(),产生异常中断,exit出来。

该宏可以屏蔽掉,只需在包含assert.h之前#define NDEBUG,想开再#undef。从这里可以看出预处理带来的方便。

函数名: assert

  功 能: 测试一个条件并可能使程序终止

  用 法: void assert(int test);

#include <assert.h>#include <stdio.h>#include <stdlib.h>struct ITEM {int key;int value;};void additem(struct ITEM *itemptr) {assert(itemptr != NULL);}int main(void){additem(NULL);return 0;}

assert() 函数用法

  assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:

  #include <assert.h>

  void assert( int expression );

  assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,

  然后通过调用 abort 来终止程序运行。

  请看下面的程序清单badptr.c:

 #include <stdio.h>#include <assert.h>#include <stdlib.h>int main( void ){FILE *fp;fp = fopen( "test.txt", "w" );//以可写的方式打开一个文件,如果不存在就创建一个同名文件assert( fp ); //所以这里不会出错fclose( fp );fp = fopen( "noexitfile.txt", "r" );//以只读的方式打开一个文件,如果不存在就打开文件失败assert( fp ); //所以这里出错fclose( fp ); //程序永远都执行不到这里来return 0;}
[root@localhost error_process]# gcc badptr.c[root@localhost error_process]# ./a.outa.out: badptr.c:14: main: Assertion `fp' failed.

已放弃

  使用assert的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。

  在调试结束后,可以通过在包含#include <assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:

  #include <stdio.h>

  #define NDEBUG

  #include <assert.h>

  用法总结与注意事项:

  1)在函数开始处检验传入参数的合法性

  如:

  int resetBufferSize(int nNewSize)

  {

  //功能:改变缓冲区大小,

  //参数:nNewSize 缓冲区新长度

  //返回值:缓冲区当前长度

  //说明:保持原信息内容不变 nNewSize<=0表示清除缓冲区

  assert(nNewSize >= 0);

  assert(nNewSize <= MAX_BUFFER_SIZE);

  ...

  }

  2)每个assert只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

  不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);

  好: assert(nOffset >= 0);

  assert(nOffset+nSize <= m_nInfomationSize);

  3)不能使用改变环境的语句,因为assert只在DEBUG个生效,如果这么做,会使用程序在真正运行时遇到问题

  错误: assert(i++ < 100)

  这是因为如果出错,比如在执行之前i=100,那么这条语句就不会执行,那么i++这条命令就没有执行。

  正确: assert(i < 100)

  i++;

  4)assert和后面的语句应空一行,以形成逻辑和视觉上的一致感

  5)有的地方,assert不能代替条件过滤

  注意:当对于浮点数:

  #include<assert.h>

  // float pi=3.14;

  // assert(pi=3.14); //

  float pi=3.14f;

  assert (pi=3.14f);

  ---------------------------------------------------------

  在switch语句中总是要有default子句来显示信息(Assert)。

  int number = SomeMethod();

  switch(number)

  {

  case 1:

  Trace.WriteLine("Case 1:");

  break;

  case 2:

  Trace.WriteLine("Case 2:");

  break;

  default :

  Debug.Assert(false);

  break;

  }

C++ assert.h头文件相关推荐

  1. C++ .h(头文件) 与 .cpp(源文件) 的使用

    .h 文件: .h是头文件 ,里面主要是写类的声明(包括类里面的成员和方法的声明).函数原型.#define常数等, 注意.h文件写的时候有特定的格式就是开头和结尾 #ifndef TEST_HEAD ...

  2. C语言不要重复包含.h头文件和.c文件

    1.不要重复包含头文件 --以上出自<C语言程序设计:现代方法(第2版)> f3.h //#ifndef AE_OK #define AE_OK 0 typedef int ngx_int ...

  3. c语言怎么创建一个h文件,求助C语言大佬 , 只会写到一个.c文件里 ,不会用.h头文件...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 简答题] 实验任务:学生成绩统计 从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能: (1)统计不 ...

  4. stdio.h头文件中申明的基本函数

    stdio.h头文件中申明的基本函数 调用scanf函数时,需传入变量的地址作为参数,scanf函数会等待标准输入设备(键盘等)输入数据,并且将输入的数据赋值给地址对应的变量. #include< ...

  5. iOS架构-静态库.a编译时自动导出.h头文件(24)

    在使用Xcode成功编译一个静态库时,在对应的输出目录下有一个include目录,但是其中没有相关的.h头文件.由于.h文件和 .cpp文件是在同一个目录下,再加上文件数量较多,如果手动的将.h文件导 ...

  6. .h头文件 .lib动态链接库文件 .dll 动态链接库

    .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够 ...

  7. c语言中count的头文件,求助C语言大佬 , 只会写到一个.c文件里 ,不会用.h头文件...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 简答题] 实验任务:学生成绩统计 从键盘输入一个班(全班最多不超过30人)学生某门课的成绩,当输入成绩为负值时,输入结束,分别实现下列功能: (1)统计不 ...

  8. .h头文件 .lib库文件 .dll动态链接库文件关系

    .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够 ...

  9. Qt警告提示:找不到“stddef.h”头文件,操蛋得很~~~

    RT,Qt提示找不到"stddef.h"头文件,操蛋得很~~~ [root@fedora workspace]# find / -name stddef.h /usr/includ ...

最新文章

  1. 程序员如何判断是否到了该辞职的时候?以及常用的辞职借口总结
  2. java条码大小_java – 自定义条形码输入中缺少条形码高度
  3. java邻接图_Java数据结构 - 图(邻接表存储)
  4. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1055:判断闰年
  5. 调查显示企业对 Linux 开发人才需求日渐增长
  6. P1332,nssl1316-血色先锋军【bfs】
  7. 【C++grammar】左值、右值和将亡值
  8. 这就是数据分析之数据采集
  9. CodeForces 722C Destroying Array
  10. 最大规模传统零售升级揭晓 100家大润发线上线下同步加入天猫618
  11. Xcode 运行程序,左侧memory 不显示内存
  12. Flutter 移动端屏幕适配方案和制作
  13. 怎么创建java项目?新建java项目的步骤
  14. 服务器电脑安装Centos7操作系统
  15. fiddler4在win7抓取https的配置整理
  16. 为你的YOLOv5任意版本添加Grad-CAM等热图可视化
  17. 【剑指 Offe】剑指 Offer 17. 打印从1到最大的n位数
  18. 【Linux系统开发】x210开发板根目录文件系统构建
  19. 江苏大学和南京工业大学计算机哪个好,江苏大学和浙江大学,哪个好?
  20. MacDroid for Mac v1.4 安卓手机文件传输助手

热门文章

  1. mysql 回档_数据库回档解决方案
  2. 怎样解决快照回档的问题
  3. 运筹学——对偶单纯形法
  4. spark的RDD中的action(执行)和transformation(转换)两种操作中常见函数介绍
  5. android studio拒绝访问,AndroidStudio错误:拒绝访问?
  6. 无处 不在的无线智能——6g 的关键驱动与研究挑战_全球首份6G白皮书出炉!
  7. 十年磨一剑,墨菲安全正式发布开源项目murphysec
  8. win10 电脑突然开不了热点解决办法
  9. mustache模板技术简介
  10. C++ static变量