我是否误解了assert()的用法?
我正在看一下assert()
参考页面 ,当我阅读给定的例子时,我遇到了困难:
/* assert example */ #include #include int main () { FILE * datafile; datafile=fopen ("file.dat","r"); assert (datafile); fclose (datafile); return 0; }
在此示例中,如果datafile比较等于0,则assert用于中止程序执行,这在前一次调用fopen不成功时发生。
我完全同意如果fopen()
失败, assert()
将中止执行。 但是我担心这个例子的正确性:
在我看来, assert()
可以检测通常不会发生的情况 (比如将NULL
指针传递给其文档声明禁止的函数)。
在此示例中,无法打开文件不是通常不会发生的事情 。 事实上,我可以看到为什么会失败的几十个原因。 该文件不存在,程序可以在没有所需权限的情况下运行,依此类推。
我宁愿做类似的事情:
/* not longer an assert example */ #include #include int main () { FILE * datafile; datafile=fopen ("file.dat","r"); if (datafile != NULL) { // Do something, whatever. fclose (datafile); } else { // Report the error somehow. } return 0; }
我对assert()
应该如何使用不正确的理解?
编辑和好消息!
看来推荐的网站是由严谨的人统治的。 这是我从网站维护者那里得到的邮件:
嗨朱利安,我不得不同意,示例代码选择不当。 它现在已被重写为更合适的东西。
非常感谢您指出这一点,并对由此给您带来的任何不便表示歉意。
最好的祝福,
更新的例子:
/* assert example */ #include #include void print_number(int* myInt) { assert (myInt!=NULL); printf ("%d\n",*myInt); } int main () { int a=10; int * b = NULL; int * c = NULL; b=&a; print_number (b); print_number (c); return 0; }
很高兴看到有些人在互联网上做得很好! ;)
你是完全正确的先生。 这是assert
的不良用法。
你确实是对的。 正如其他人已经指出的那样, assert()
很可能在发布版本中被编译出来(我看到人们强迫断言留在发布版本中)。
我只想添加一个与我在代码库中看到的这个问题相关的恐怖故事:
assert(do_something() == NO_ERR);
不应该允许某些人使用键盘。
次要通知:如果你写的话会更好..
FILE * datafile = NULL;
此外,断言仅适用于调试模式…因此您的方法更好。