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

ere*_*eOn 21 c c++ assert

我正在看assert()参考页,虽然我读给定的例子,我卡住了:

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

int main ()
{
  FILE * datafile;
  datafile=fopen ("file.dat","r");
  assert (datafile);

  fclose (datafile);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,如果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;
}
Run Code Online (Sandbox Code Playgroud)

我的理解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;
}
Run Code Online (Sandbox Code Playgroud)

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

Ale*_* C. 13

你是完全正确的先生.这是一个很糟糕的用法assert.

  • 感谢您的反馈.我写信给联系页面告诉他们这个问题.我想知道他们是否会更新它. (2认同)