我正在看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;
}
很高兴看到有些人在互联网上做得很好! ;)
答案 0 :(得分:13)
assert
的使用率很低。
答案 1 :(得分:2)
答案 2 :(得分:1)
次要通知:如果你写的话会更好..
FILE * datafile = NULL;
此外,断言仅适用于调试模式...因此您的方法更好。