Я просматривал страницу справки 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 используется для прерывания выполнения программы, если datafile сравнивается с 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;
}
Рад видеть, что некоторые люди хорошо делают свою работу в Интернете! ;)
assert
предназначен для ошибок программирования, а не ошибок пользователя. - person GManNickG   schedule 23.07.2010assert()
можно использовать и вC++
. Тег был здесь только для того, чтобы расширить аудиторию, поскольку люди, которые делают толькоC++
, также могут быть заинтересованы в ответах. - person ereOn   schedule 23.07.2010assert()
. Является ли это кодомC
илиC++
, совершенно не имеет значения. Если вас это так сильно беспокоит, замените строковые литералы наstd::string
... но тогда вы, вероятно, будете жаловаться на тегC
. Не хочешь? - person ereOn   schedule 23.07.2010assert
функциональные возможности, вам потребуются сотни тегов, чтобы пометить их все), но я м тут запутался. Судя по истории редактирования, даже в первой версии вопроса была 1. ссылка на cplusplus.com и 2. примеры кода, написанные на C++. Я не понимаю, почему использование тега c++ неправильно. Также +1 отсюда - person jalf   schedule 23.07.2010assert()
для создания короткого и целенаправленного примера кода имеет давнюю традицию. Код примера, правильно обрабатывающий все пути ошибок, сбивает с толку. - person Georg Fritzsche   schedule 23.07.2010