我是否误解了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; 

此外,断言仅适用于调试模式…因此您的方法更好。