我正在看的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)
很高兴看到有些人在互联网上做得很好!;)