Ошибка: разница между perror и fprintf - PullRequest
0 голосов
/ 30 сентября 2019

Есть ли разница между следующими двумя подходами при обнаружении и ошибке?

if (!mallocd_buffer) {

    // this?
    fprintf(stderr,"malloc() failed in file %s at line # %d", __FILE__, __LINE__);

    // or this?
    perror("Failed to copy a string\n\n\n\n\n");

    exit(EXIT_FAILURE);
}

1 Ответ

0 голосов
/ 30 сентября 2019

Используя perror, вы получите системное сообщение об ошибке, подразумеваемое текущим значением errno в выводе, после строки, которую вы указали в качестве аргумента.

Используя fprintf(stderr, "…", …), выв полном контроле форматирования.

Я редко использую perror();это не соответствует моим требованиям, так как форматирование строки для передачи является довольно сложным. Я использую написанные мной функции, такие как err_syserr() - код, который доступен в моем репозитории SOQ (вопросы о переполнении стека) на GitHub в виде файлов stderr.c и stderr.h в src / libsoq подкаталог.

В BSD есть аналогичный пакет, который называется err(3);Вы также можете найти его в Linux (см. err(3)). Вы, вероятно, предпочтете использовать это вместо моего кода, хотя бы потому, что системным функциям удается косвенно привязаться к значению argv[0], тогда как мой код не потому, что нет портативного интерфейса для доступа к * 1023. * за исключением аргументов main()), поэтому мой код полагается на то, что вы вызываете err_setarg0(argv[0]) в main() для установки имени программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...