2-1 断言

2.1 断言

2.1.1 断言的定义

一般来说,断言assert用于debug模式下测试可能出现的问题,在release模式下,使用宏NDEBUG来将其注释掉。下面是一个assert的大致定义。

#ifdef NDEBUG
#define assert(cond) ((void)0)
#else
void assertImpl(const char*, const char*, long);
#define assert(cond) \
((cond) ? (void)0 : assertImpl(???))
#endif

说明:

  • assertImpl由每个编译器自己实现的。接收三个参数,分别是文件名,所在行数和cond的文本。

  • 常用定义NDEBUG的方式:作为编译选项给整个程序定义

    •   g++ -DNDEBUG myfile.cpp 
        

      * 不要用断言来验证函数的参数,而是抛出异常`logic_error`

      #### 2.1.2 断言的案例

      ```C++
      void MyVector::push_back(int x)
      {
      if(nextSlot==capacity)
      {
      grow();
      }
      assert(nextSlot<capacity); //如果空间增长失败
      data[nextSlot++] = x;
      }