我误解了assert()的用法吗?

时间:2010-07-23 09:20:49

标签: c++ c assert

我正在看the assert() reference page,当我读到给定的例子时,我被卡住了:

/* assert example */
#include <stdio.h>
#include <assert.h>

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 <stdio.h>
#include <assert.h>

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 <stdio.h>
#include <assert.h>

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;
}

很高兴看到有些人在互联网上做得很好! ;)

3 个答案:

答案 0 :(得分:13)

先生,你是完全正确的。这是assert的使用率很低。

答案 1 :(得分:2)

答案 2 :(得分:1)

次要通知:如果你写的话会更好..

FILE * datafile = NULL;

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