У меня есть эта функция:
Tcl_Obj* cFuncTcl (Tcl_Interp* interp, Tcl_Obj* obj) {
Tcl_Obj *listObj = Tcl_NewListObj (0,NULL);
const char* var = Tcl_GetString(obj);
if (strcmp(var, "foo")) {
fprintf(stderr, "error\n");
exit(EXIT_FAILURE);
} else {
// Do something
}
return listObj;
}
Я использую return Tcl_ERROR;
, когда моя функция возвращает целое число, чтобы сообщить об ошибке, но здесь моя функция возвращает obj
.
Мой вопрос: существует ли эквивалент API C Tcl для выхода (EXIT_FAILURE)?
@Clifford Да, я использую язык C для общения с Tcl. return Tcl_ERROR;
останавливает мою программу и выдает ошибку в интерпретаторе.
Хорошо, возможно, это имело бы больше смысла, если бы я когда-либо использовал Tcl! ;-) Если мой ответ — чепуха, то вот почему, но я оставлю его в силе, если только вы не укажете, что я неправильно понял вопрос.
@Клиффорд Я думал, что мой вопрос ясен, я хочу заменить it
на this
, чтобы иметь такое же поведение (завершает процесс). return Tcl_ERROR;
(думаю, не C-программист) делаю то же самое. Спасибо Tcl_Exit()
мне кажется подходит, буду тестировать.
Я думаю, разница в том, что Tcl_exit
вызывает вызов всех зарегистрированных обработчиков выхода Tcl, а exit()
пропускает этот шаг «очистки». Так что не совсем то же самое.
Я использую возврат Tcl_ERROR; когда моя функция возвращает целое число, чтобы сообщить об ошибке,
Сообщить об ошибке через возвращаемое значение — это не то же самое, что exit()
, который завершает процесс. Для завершения процесса не требуется API TCL, чем это будет отличаться от exit()
?
Если вы хотите вернуться из этой функции с указанием ошибки, а не прерывать ее, просто верните NULL — возвращаемое значение — это указатель или объект, а не сам объект, поэтому возврат NULL — это идиоматический способ указать на ошибку.
Tcl_Obj* cFuncTcl (Tcl_Interp* interp, Tcl_Obj* obj)
{
Tcl_Obj *listObj = Tcl_NewListObj (0,NULL);
const char* var = Tcl_GetString(obj);
if (strcmp(var, "foo"))
{
fprintf(stderr, "error\n");
return NULL ;
}
else
{
// Do something
}
return listObj;
}
Существует ли эквивалент API C Tcl для выхода (EXIT_FAILURE)?
API полностью документирован и существует API завершения процесса, который включает Tcl_Exit()
, но неясно, что именно вам нужно в данном случае. Кажется, вы путаете завершение процесса с функцией, возвращающей статус ошибки. Тем не менее:
Tcl_Obj* cFuncTcl (Tcl_Interp* interp, Tcl_Obj* obj)
{
Tcl_Obj *listObj = Tcl_NewListObj (0,NULL);
const char* var = Tcl_GetString(obj);
if (strcmp(var, "foo"))
{
fprintf(stderr, "error\n");
Tcl_Exit( Tcl_ERROR ) ;
}
else
{
// Do something
}
return listObj;
}
Если вы говорите о реализации команды Tcl, return TCL_ERROR;
сигнализирует о том, что что-то пошло не так (и TCL_OK
так и было бы, если бы это работало). На уровне сценария Tcl это становится выданной ошибкой (с сообщением об ошибке в результате интерпретатора), которую вы обрабатываете с помощью catch
или try
. Код, который в конечном итоге вызвал Tcl_Eval()
или Tcl_EvalFile()
, должен решить, что делать, если ошибка зайдет так далеко; в tclsh
распечатывается трассировка очистки стека ошибок и процесс завершается... но на самом деле это самый простой вариант.
На уровне всего процесса используйте Tcl_Exit(EXIT_FAILURE);
в C. Или exit 1
в скрипте. Делает то, что заявлено (после запуска критических обработчиков выхода для выполнения таких действий, как очистка буферов ввода-вывода).
Ценность вызова Tcl_Exit
заключается в том, что он также обрабатывает завершение рабочего потока и переопределение на уровне Tcl.
Спасибо за подробный ответ. Приятно вас читать.
Ваш вопрос неясен - и, возможно, проблема XY. Если вы выходите, процесс завершается, никакой TCL API не будет иметь значения, завершение - это хорошо... терминально.