Должен ли C API возвращать значение или код ошибки? - PullRequest
0 голосов
/ 05 июня 2018

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

int get_value(void * store, char ** result);

или

char * get_value(void * store, int * error);

Мне трудно прийти с какой-либо объективной причиной, чтобы предпочесть одно другому, но опять же, я не так много пишу C.Код ошибки возврата будет выглядеть более согласованным при наличии нескольких выходных параметров, однако возвращаемое значение может быть немного проще в использовании?Не уверен.

Есть ли общее мнение о том, какой стиль лучше и почему, или это просто личное предпочтение?

1 Ответ

0 голосов
/ 05 июня 2018

Как правило, нет хороших, "жестких" ответов на подобные вопросы.Ниже приведены мои мнения;другие не согласятся.

  • Наличие функции, просто возвращающей возвращаемое значение, обычно облегчает для вызывающей стороны - до тех пор, пока вызывающая сторона заинтересована в получении ответов, а не обязательно в оптимальной обработке ошибок.

  • Наличие всех функций, возвращающих коды успеха / неудачи - возвращение любых других данных через параметры «результата» - обеспечивает чистую и последовательную обработку ошибок, но, как правило, менее удобно для вызывающих,Вы всегда должны объявлять дополнительные переменные (правильного типа) для хранения возвращаемых значений.Вы не можете обязательно писать такие вещи, как a = f(g());.

  • Обычный возврат значений и указание ошибок через обычное возвращаемое значение «вне диапазона» - популярный метод -каноническим примером является стандартная функция C getchar, но она может восприниматься как специальная и подверженная ошибкам.

  • Возвращение значений через возвращаемое значение и коды ошибок через "возвратный параметр, необычно.Я вижу привлекательность, но не могу сказать, что когда-либо использовал эту технику, или хотел бы.Если требуется возврат ошибки, отличной от возвращаемого значения, «путь C» (хотя, конечно, это, как правило, довольно плохая идея, и сейчас довольно сильно устарела), заключается в использовании какой-то глобальной переменной, как * 1019.*.

  • Если вы хотите обратить внимание на первоначальный «дух C», это было очень удобно программисту и не слишком беспокоилось о жесткой согласованности, и обычнохорошо со здоровыми ложками несогласованности и ad-hocciness.Так что использование внеполосных возвратов ошибок - это нормально.

  • Если вы хотите обратить внимание на современное использование, оно, похоже, все больше склоняется к соответствию и правильности, а это означает, что последовательное возвращение ошибоксхемы - это хорошо, даже если они менее удобны.Поэтому иметь возвращаемое значение в виде кода успеха / сбоя и данные, возвращаемые параметром результата, вполне нормально.

  • Если вы хотите, чтобы возвращаемое значение было возвращаемым значением, для удобстваи если ошибки являются необычными, но для тех вызывающих абонентов, которые заботятся о вас, вы хотите предоставить им способ получения детальной информации об ошибках, хорошим компромиссом иногда является наличие отдельной функции для извлечения подробностей самой последней ошибки.Это по-прежнему может привести к тем же видам состояния гонки, что и к глобальной переменной, но если ваша библиотека использует какие-то «дескрипторы» или «дескрипторы», то есть вы можете сделать так, чтобы эта функция сведений об ошибках возвращала подробности большинстванедавняя операция с определенной ручкой , она может работать довольно хорошо.

...