zoukankan      html  css  js  c++  java
  • 关于ASSERT(断言)使用的规则

    程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。
    断言assert 是仅在Debug 版本起作用的宏,它用于检查“不应该”发生的情况。示例6-5 是一个内存复制函数。在运行过程中,如果assert 的参数为假,那么程序就会中止(一般地还会出现提示对话,说明在什么地方引发了assert)。

    void *memcpy(void *pvTo, const void *pvFrom, size_t size)
    {
        assert((pvTo != NULL) && (pvFrom != NULL)); // 使用断言
        byte *pbTo = (byte *) pvTo; // 防止改变pvTo 的地址
        byte *pbFrom = (byte *) pvFrom; // 防止改变pvFrom 的地址
        while(size -- > 0)
            *pbTo ++ = *pbFrom ++ ;
        return pvTo;
    }
    示例6-5 复制不重叠的内存块

    assert 不是一个仓促拼凑起来的宏。为了不在程序的Debug 版本和Release 版本引起差别,assert 不应该产生任何副作用。所以assert 不是函数,而是宏。程序员可以把assert看成一个在任何系统状态下都可以安全使用的无害测试手段。如果程序在 assert 处终止了,并不是说含有该assert 的函数有错误,而是调用者出了差错,assert 可以帮助我们找到发生错误的原因。

    很 少有比跟踪到程序的断言,却不知道该断言的作用更让人沮丧的事了。你化了很多时间,不是为了排除错误,而只是为了弄清楚这个错误到底是什么。有的时候,程 序员偶尔还会设计出有错误的断言。所以如果搞不清楚断言检查的是什么,就很难判断错误是出现在程序中,还是出现在断言中。幸运的是这个问题很好解决,只要 加上清晰的注释即可。这本是显而易见的事情,可是很少有程序员这样做。这好比一个人在森林里,看到树上钉着一块“危险”的大牌子。但危险到底是什么?树要 倒?有废井?有野兽?除非告诉人们“危险”是什么,否则这个警告牌难以起到积极有效的作用。难以理解的断言常常被程序员忽略,甚至被删除。

    【规则6-5-1】使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。
    【规则6-5-2】在函数的入口处,使用断言检查参数的有效性(合法性)。
    【建议6-5-1】在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。
    【建议6-5-2】一般教科书都鼓励程序员们进行防错设计,但要记住这种编程风格可能会隐瞒错误。当进行防错设计时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警。

    ASSERT宏中应该包含的元素:

    判断条件;输出当前断言失败的位置(文件、行数等);返回错误;终止程序...

    几种典型的ASSERT的写法:

    VC中的写法:

    #define ASSERT(f) \
    do \
    { \
      if (!(f) && AfxAssertFailedLine(THIS_FILE, __LINE__)) \
      AfxDebugBreak(); \
    } while (0) \

    #define _ASSERT(expr) \
            do { if (!(expr) && \
                    (1 == _CrtDbgReport(_CRT_ASSERT, __FILE__, __LINE__, NULL, NULL))) \
                 _CrtDbgBreak(); } while (0)

    其他平台的写法:

    # define ASSERT(x) ((x) || (dbg_printf("assertion failed ("__FILE__":%d): \"%s\"\n",__LINE__,#x), break_point(), FALSE))

  • 相关阅读:
    uva 147 Dollars
    hdu 2069 Coin Change(完全背包)
    hdu 1708 Fibonacci String
    hdu 1568 Fibonacci
    hdu 1316 How Many Fibs?
    poj 1958 Strange Towers of Hanoi
    poj 3601Tower of Hanoi
    poj 3572 Hanoi Tower
    poj 1920 Towers of Hanoi
    筛选法——素数打表
  • 原文地址:https://www.cnblogs.com/jincwfly/p/893974.html
Copyright © 2011-2022 走看看