新闻资讯
看你所看,想你所想

assert.h

assert.h常用来自于防御式编程。断言(Ass起太制排ertions),一个断言通常是一个例程(routines)或者一个宏(marcos)。每个断言通常含有两个参数:一个布尔表示式(a boolean expression)和一个消息(a 翻输但委落绝message)。

  • 外文名称 assert.h
  • 常用于 防御式编程
  • 参数 布尔表示式,消息
  • 特点 可以使用断言

  assert.h assert.h常用于防御式编程。

  断言(Assertions)

  一个布尔表达式的反面表示标且完范微一市氧护皇存了一个错误。C 标准库提供了一个 assert 宏,它只带有一个参数,用法如下:

  assert(1 == 0); // 注意 boolean expression 不要加引号

  使用 assert 宏,需要包含头文件 cassert 或者 asser领溶局t.h,执行上面语句的结果是程序终止运行,输来自出与下面消息类似的360百科消息:

  Assertion failed: 1 == 0, file d:\我的文档毛真剂唱船来\visual studio projects\learning\assert器善零手师派上\assert.cpp, line 9

  通常来说,我们会定义自己的 assert 宏,其目的有两个:

  (1)新增参数,例如新增一个消息参数,使得 assert 宏输出更为丰富的信息。

  (2)改变 assert 的行为内容。C 标准库中的 assert 宏将中断程序,实际上,我们可以让程序继续运行而不中断或者进入调试状态等,另外还可以控制消息输出的目标,即控制消息是输出到控制台还是文本文件,叫粒红势甚至是通过网络发出。

  下面是一个 C++ 实现的断言:

  #ifdef _DEBUG

  #define Assert(exp, message) \

  { \

  if (!(exp)) \

  { \

  std::cout << "Assertion failed: " << #exp << "\n" \

  << "M种上全影销从官似希元还essage: " << messa案守语害孩因ge << "\n" \

  << "line: " << __LINE__ << "\n" \

  << "file: " << __FILE__ << "\n"; \

  exit(EXIT_FAILURE); \

  } \

  }

  #困失else

  #defi价着统伤迫屋她ne Assert(exp, message)

  #endif

  执行 Assert(1 == 0, "Err迅稳强想上争随族展降or"); 结果为:

  Assertion failed: 1 == 0

  Message: Error

  line: 24

  file: d:\我的文档\visual studio projects\learning\assert\assert鲁被适刘绿范架每市.cpp

  使用断言应该注意一下的几个问题:

  1预振征未齐关将裂掉)对非预期错误使用断言

数饭  断言中的布尔表达式的反面一定要描述一个非预期错误,下面所述的在一定情况下为非预期错误的一些例子:

  (1)空指针。

  (2)输入或者输出参数的值不在预期范围内。

  (3)数组的越界。

  非预期错误对应的就是预期错误,我们通常使用错误处理代码来处理预期错误,而使用断言处理非预期错误。在代码执行过程中,有些错误永远不应该发生,这样的错误是非预期错误。断言可以被看成是一种可执行的注释,你不能依赖它来让代码正常工作。例如:在

  int nRes = f(); // nRes 由 f 函数控制, f 函数保证返回值一定在 -100 ~ 杂室酒体100

  Assert(-100 <= nRes && nRes <= 100); /陈印考田第/ 断言,一个可执行的注释

  由于 f 函数保证了返回值处于 -100 ~ 100,那么如果出现了 nRes 不在这个范围的值时,就表明一个非预期错误的出现。后面会讲到"隔栏",那时会对断言有更加深刻的理解。

  2)不要把需要执行的代码放入断言中

  断言用于软件的开发和维护,而通常不在发行版本中包含断言。

  需要执行的代码放入断言中是不正确的,因为在发行版本中,这些代码通常不会被执行,例如:

  Assert(f()); // f 函数通常在发行版本中不会被执行

  而使用如下方法则比较安全:

  res = f();

  Assert(res); // 安全

  3)对来源于内部系统的可靠的数据使用断言,而不要对外部不可靠的数据使用断言,对于外部不可靠数据,应该使用错误处理代码。再次强调,把断言看成可执行的注释。

  前条件(preconditions)和后条件(postconditions)

  前条件是调用方代码在调用例程(routines)或者实例化对象之前要确保为真的条件,后条件是例程执行后或者类实例化后应满足的条件。下面是一个例子:

  // 前条件,这里 nNum1 和 nNum2 的取值被前面代码所约束并保证取值在 -50 ~ 50

  Assert(-50 <= nNum1 && nNum1 <= 50, "Add_nNum1");

  Assert(-50 <= nNum2 && nNum2 <= 50, "Add_nNum2");

  int nRes = add(nNum1, nNum2);

  // 后条件

  Assert(-100 <= nRes && nRes <= 100, "Add_nRes");

  注意,由于 nNum1 和 nNum2 取值范围已经被约束,因此可以使用断言,但是如果 nNum1 和 nNum2 的值来源于不可靠的外部系统,那么应该使用错误处理代码,而不是使用断言。

转载请注明出处安可林文章网 » assert.h

相关推荐

    声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:fendou3451@163.com