Подтвердить что ты не робот

Является ли проверка возвращаемого значения 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.

Итак, когда нужно проверить возвращаемое значение и как его обрабатывать?

4b9b3361

Ответ 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(), или немало других вещей. Если нет разумного способа воздействовать на часть информации, зачем ее собирать?