Exit(EXIT_FAILURE) : эквивалент Tcl C API

У меня есть эта функция:

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)?

Ваш вопрос неясен - и, возможно, проблема XY. Если вы выходите, процесс завершается, никакой TCL API не будет иметь значения, завершение - это хорошо... терминально.

Clifford 21.03.2024 11:50

@Clifford Да, я использую язык C для общения с Tcl. return Tcl_ERROR; останавливает мою программу и выдает ошибку в интерпретаторе.

Mkn 21.03.2024 12:08

Хорошо, возможно, это имело бы больше смысла, если бы я когда-либо использовал Tcl! ;-) Если мой ответ — чепуха, то вот почему, но я оставлю его в силе, если только вы не укажете, что я неправильно понял вопрос.

Clifford 21.03.2024 13:12

@Клиффорд Я думал, что мой вопрос ясен, я хочу заменить it на this, чтобы иметь такое же поведение (завершает процесс). return Tcl_ERROR; (думаю, не C-программист) делаю то же самое. Спасибо Tcl_Exit() мне кажется подходит, буду тестировать.

Mkn 21.03.2024 13:29

Я думаю, разница в том, что Tcl_exit вызывает вызов всех зарегистрированных обработчиков выхода Tcl, а exit() пропускает этот шаг «очистки». Так что не совсем то же самое.

Clifford 21.03.2024 13:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
91
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я использую возврат 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.

Donal Fellows 22.03.2024 13:02

Спасибо за подробный ответ. Приятно вас читать.

Mkn 22.03.2024 14:15

Другие вопросы по теме