14.9 断言与调试:assert.h
在老派的电影中,重要人物在临死之前通常总能留下关键性的只言片语。
程序也会因为这样或那样的潜伏着的错误而死(down),在程序开发的初期尤其如此。与其让程序默默无闻地死去,不如让它死前留下只言片语,这对于寻找程序中的错误非常有意义。
如果希望达到这样的效果,可以使用“assert()”这个函数(其实多数情况下是个很像函数的宏,但尽管把它当作函数无妨)来实现。
由于“assert()”是在assert.h中说明的,所以首先要
然后在你感觉有些不安,担心会出问题的地方调用它。比如,你拿不准是否会对一个负值开方,就可以
如果“x>0”的值不为0,那么程序会若无其事地继续执行下面一句“y=sqrt(x);”。一旦出现“x>0”的值为0的情况,程序会在执行“y=sqrt(x);”之前停止,并输出程序是在哪个源文件(源程序可能由多个源文件组成)、哪一行、x的值为何时停止的(C99还可以输出是在哪个函数中停止的)。这无疑对查找程序中的错误提供了很重要的线索。
这样会影响程序的执行效率么?当然。所以一旦错误找到之后,就不希望“assert(x>0);”继续存在了。但是,在一个大型软件开发中,删除源代码绝对是需要特别慎重的事情,因为失误不起,一旦失误造成的损失和混乱可能是惊人的。所以职业开发者通过在代码中定义一个宏来实现删除。
有了“#define NDEBUG”,“assert(x>0);”不会被编译,相当于事实上被删除了。尽管在形式上,它依然留在代码中,但是你可以把它作为一条注释看待,它比真正的注释更漂亮、更具备专业感。
最后说一句,assert()参数应该是“int”类型,可以把它看成下面这样的函数。