Является ли проверка возвращаемого значения printf важным?
В одном из моих университетских проектов у меня появились очки и отзывы моего профессора, сказав, что я не обрабатывал ошибки printf
.
На английском → / * ### FB: Error handling printf () is missing * /
/* ### FB: Fehlerbehandlung printf() fehlt */
printf("%7lu %8lld %10s %3lu %-8s %-8s %8lu %12s %s %s %s\n",
sb->st_ino, nblks, permstr, (unsigned long) sb->st_nlink,
username, groupname, sb->st_size,
ntime, filename, (symlink ? "->" : ""),
(symlink ? symlink : "")
);
Мой вопрос: действительно ли важно всегда проверять возвращаемое значение функции printf
и обрабатывать ошибки? Даже если я нахожу ошибку, я все равно использую fprintf
для печати на stderr
, для которого я должен снова проверить тип возврата для fprintf
.
Итак, когда нужно проверить возвращаемое значение и как его обрабатывать?
Ответы
Ответ 1
Вообще говоря, вы всегда должны проверять возвращаемое значение функции для ошибок.
Однако в случае printf
в большинстве случаев мало что нужно сделать. Как вы упомянули, если это произойдет, вы можете использовать fprintf
для печати на stderr
, но затем возникает вопрос о том, должен ли быть проверен на предмет ошибки.
Если вы не перенаправляете или не открываете stderr
, у вас, вероятно, будет такая же проблема, и в этом случае это, вероятно, не имеет значения, но если stderr
указывает куда-то еще, тогда запись там может иметь значение. Вы также можете выйти из процесса, но вам нужно определить, имеет ли смысл это делать.
В одно замечательное время вы можете проверить возвращаемое значение, если вы хотите отслеживать, сколько символов вы печатали для форматирования. Я сделал это с помощью fprintf
при записи в файл журнала, чтобы определить, когда нужно свертывать журнал, но поскольку printf
обычно записывает в интерактивную консоль (и если это не связано с перенаправлением, вы бы этого не знали), это на самом деле не применимо.
Что касается вашего профессора, то я предполагаю, что он хочет, чтобы вы привыкли проверять ошибки. Это хорошая вещь, однако, как и большинство правил, есть исключения, и это один из них.
Ответ 2
Для ясности - printf()
возвращает...
Функция printf
возвращает количество переданных символов или отрицательное значение, если произошла ошибка вывода или кодирования. C11 §7.21.6.3 3
Проверка возвращаемого значения printf()
для отрицательного значения pedantic и обычно не требуется. Можно было бы рассмотреть следующие случаи:
Экологические ограничения.
Единственный printf()
с "%s"
может превышать пределы среды и вызывать printf()
для возврата отрицательного значения. Это не означает, что последующее сообщение на fprintf(stderr, ...
также должно завершиться неудачей.
Число символов, которые могут быть получены с помощью одного преобразования, должно быть не менее 4095. C11 §7.21.6.1 15
Слабые устройства вывода.
Случай, когда stdout
, как известно, часто перенаправляется по интерфейсу связи, где необходимо обнаруживать сбои вывода. Несмотря на то, что выход на экран имеет необычайно высокий успех, это не так с другими выходными потоками, такими как serial (rs232). В этом случае stdout
и stderr
могут перенаправляться по-разному, и поэтому stderr
может оставаться надежным.
В любом случае, если профессор оценивает кривую, вероятно, многие из них понесли ту же минусовую точку - так что никакой разницы в классе. Используйте клиентов с нестандартными требованиями и ожиданиями.
Ответ 3
Не проверять возвращаемое значение считается плохой практикой. НО считается чистым, если вы явно заявляете, что игнорируете возвращаемое значение, добавляя (void)
infront вызова функции:
(void) printf(...);
Это означает, что вы знаете, что есть возвращаемое значение, но вы намеренно игнорируете его.
Ответ 4
Философия Unix заключается в том, что stdout
(хотя необязательно stderr
) должен быть далее обрабатываемым. Компиляторы и генераторы используют его для вывода кода.
stdout
должен находиться в вашем продукте. Если этот продукт прерван, ваши процессы не должны возвращаться EXIT_SUCCESS
.
Я говорю, проверяем эти записи на stdout
.
(stderr
, с другой стороны, более или менее для удобства. Если вы используете его, вы, вероятно, уже в состоянии ошибки, и если ваша отчетность об ошибках терпит неудачу, вас не так много (хотя вы все равно должны сигнализировать об ошибке с помощью кодов возврата).)
Ответ 5
Нет. В реальном мире, в отличие от академических упражнений в области культуры, не важно проверить возвращаемое значение printf()
, или close()
, или немало других вещей. Если нет разумного способа воздействовать на часть информации, зачем ее собирать?