3

Для моего класса системного программирования мы делаем много программирования в C и обязаны проверять ошибки большинства функций, поскольку в настоящее время мы учимся программировать с помощью pthreads.C Функция проверки ошибок

Причина, по которой я говорю, что это не настоящая домашняя работа, заключается в том, что она намного выше и выше ожидаемой для этого класса. Просто проверка каждой функции по отдельности более чем удовлетворительная. Я просто считаю, что это трудоемкий и грязный метод и надежду на более аккуратное решение.

Мне было интересно, может ли кто-нибудь показать мне, как написать функцию, которая принимает любую функцию C Функция в качестве параметра, за которой следуют все необходимые параметры для этой функции, а также требуемое возвращаемое значение (в этом случае правильное один) и выполняет следующее.

if(function_name(param1, param2, ...) != desired_return_value) { 
    fprintf(stderr, "program_name: function_name() failed\n"); 
    perror("function_name(): "); 
} 

Возможно ли это? Это вряд ли требуется по нашему курсу, но это просто раздражает меня, что практически любая функция, которую я пишу, должна содержать 4 строки кода, чтобы проверить это. Это очень тяжело читать.

Даже некоторые другие предложения были бы хорошими. Я просто пытаюсь повысить удобочитаемость, поэтому, если это полностью неправильное направление, было бы высоко оценено правильное направление.

EDIT: Это должно составить по стандарту gnu99 идеала: P

EDIT 2: В ответ на Джеймс McNellis: Ошибки из наших функций нет (я считаю, в данном случае), необходимость для обработки. Уведомление должно быть предоставлено. Мы ничем не занимались обработкой ошибок, связанных с потоком/процессом (который является предметом обсуждения в двух словах).

+1

Ну, это не настоящая домашняя работа, но я не скажу, что вы не сказали, что это не так. – Alex

+2

Это не дроиды, которых ты не ищешь. – detly

+0

По моему опыту, во многих случаях, но особенно в коде потоков, а не при обработке ошибок, это верный путь к раннему облысению, головным болям и многим часам поздней ночной отладки. Проблема заключается в высокой вероятности длительного времени задержки между написанием кода, который нарушает какое-либо предположение, и кодом, который зависит от него. – RBerteig

ответ

13

Написание общего кода на C без использования макросов - это не самая простая задача.

В (очень) основном растворе с использованием VARIADIC макрокоманды:

#define CALL_AND_CHECK(f, r, ...)        \ 
    do {               \ 
     if (f(__VA_ARGS__) != r)         \ 
     {              \ 
      fprintf(stderr, "program_name: " #f "() failed\n"); \ 
      perror(#f "(): ");         \ 
     }              \ 
    } while (0) 

(См Why are there sometimes meaningless do/while and if/else statements in C and C++ macros? того, почему «бессмысленно» делать/в то время как цикл используется)

Обратите внимание, что вывод на печать сообщения об ошибке и фактически не обрабатывает ошибку, это почти наверняка плохая идея. Как правило, разные ошибки должны обрабатываться по-разному, поэтому общий код, подобный этому, может оказаться не особенно полезным. Если вы не хотите пытаться восстановиться с любой из этих ошибок, вы можете exit(), что может быть хорошо для задания, хотя в реальной программе вы не захотите этого делать.

+0

@ Джеймс Макнеллис У нас были массивные шпионы о том, как макросы плохи, но нет реального оправдания. При каких обстоятельствах это будет проблемой? Или какие проблемы присущи, что я должен искать и знать, прежде чем использовать макросы. – Ben

+0

@Ben: Макросы плохие, когда они делают код более сложным для понимания. Они хороши, когда они уменьшают количество кода, который вы должны писать, и когда они делают код более понятным. Часто весьма субъективно, является ли данное использование хорошей идеей или нет. –

+0

Cheers. Давайте оставим это открытым некоторое время и посмотрим, появятся ли другие ответы. – Ben

Смежные вопросы