Что возвращать в C, когда нужно выбросить исключение на другом языке, таком как C ++? - PullRequest
1 голос
/ 26 апреля 2011

Я реализовал функцию htoi (от шестнадцатеричного целого до восьмеричного целого) в C. Сигнатура функции выглядит следующим образом:

int htoi(char* s);

Основная логика довольно проста, и моя главная задача - как справиться сданные экстремальных испытаний, такие как недопустимое шестнадцатеричное число, такое как oxazzz , ox ??? DFSLA .Очевидно, что некоторое магическое число не будет работать, поскольку результатом могут быть любые целые числа.

Одно из решений, которое я хотел бы принять, - изменить сигнатуру функции, например:

int htoi(char* s, bool* error);

И установите ошибку как true, если s не является действительным шестнадцатеричным числом. Но кажется, что это не очень хорошее решение.Следовательно, что должно быть лучшим решением для решения этой ситуации, поскольку в C нет механизма выброса исключений?

Ответы [ 6 ]

5 голосов
/ 26 апреля 2011

Посмотрите, как это делает strtol(3) . Не сказать, что это идеально, просто пример.

3 голосов
/ 26 апреля 2011
int htoi(char* s, int* result);

вернуть 0 (или -1, или что вы хотите) при ошибке.

Другой вариант:

int* htoi(char* s, int* result);

Вы возвращаете указатель на result (тот же указатель, который вы передали) в случае успеха, NULL при ошибке.

Мне нравится последний стиль; if (htoi(myString, &myInt) == NULL) { /* bad thing */ }

3 голосов
/ 26 апреля 2011

Я бы предложил передать выходную переменную в сигнатуру функции и вернуть значения как SUCESS / FAILURE

error_type function_name ( input_variable, *input_output_variable);
2 голосов
/ 26 апреля 2011

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

1 голос
/ 26 апреля 2011

Идея использования дополнительного аргумента довольно распространена.Используйте указатель для аргумента error.Еще лучшая идея - возвращать успех / неудачу и сохранять фактический результат через указатель.

Кроме того, некоторые функции стандартной библиотеки C (семейство strtol) обрабатывают это, указывая, что функция устанавливает errnoпо ошибке.Это еще одна возможность, хотя она приводит к несколько громоздкой идиоме

errno = 0;  // errno may have been set previously
x = strtol(str, NULL, 10);
if (errno)
    // handle error
0 голосов
/ 27 апреля 2011

Возвращение кода ошибки, кажется, является стандартом de facto , но, на мой взгляд, это довольно утомительно и подвержено ошибкам.

Вместо этого вы можете использовать некоторую систему обработки исключений в C дляна самом деле throw исключение.

Например, я разрабатываю exceptions4c , и есть много других альтернативных библиотек .

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