我在the assert()
reference page考慮看看,我卡住了,而我讀給定的例子:我誤解了assert()的用法嗎?
/* assert example */
#include <stdio.h>
#include <assert.h>
int main()
{
FILE * datafile;
datafile=fopen ("file.dat","r");
assert (datafile);
fclose (datafile);
return 0;
}
在這個例子中,使用assert如果數據文件進行比較等於0中止程序執行,這恰好當前打電話給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;
}
高興地看到,有些人做他們的工作以及在互聯網上! ;)
+1認識到這是一個不好的例子。 +2然後郵寄網站聯繫人。 – 2010-07-23 09:52:50
你的理解是現貨。 'assert'用於編程錯誤,而不是用戶錯誤。 – GManNickG 2010-07-23 09:56:32
我刪除了C++標籤,因爲帖子中沒有C++代碼。 – Puppy 2010-07-23 10:29:42