exit(EXIT_FAILURE):相当于 Tcl C API

问题描述 投票:0回答:2

我有这个功能:

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(EXIT_FAILURE)

c tcl
2个回答
1
投票

如果您正在谈论 Tcl 命令实现,则

return TCL_ERROR;
表示出现问题(如果成功,则
TCL_OK
表示)。在 Tcl 脚本级别,这会成为抛出的错误(在解释器结果中带有错误消息),您可以使用
catch
try
进行处理。由最终调用
Tcl_Eval()
Tcl_EvalFile()
的代码来决定如果错误冒出那么远该怎么办;在
tclsh
中,打印了错误堆栈展开跟踪并且该过程存在......但这实际上只是最简单的选项。

在整个流程级别,在 C 中使用

Tcl_Exit(EXIT_FAILURE);
。或者在脚本中使用
exit 1
。执行它上面所说的操作(在运行关键退出处理程序以执行诸如刷新 I/O 缓冲区之类的操作之后)。


0
投票

我使用 return Tcl_ERROR;当我的函数返回一个整数来报告错误时,

通过其返回值报告错误与终止进程的

exit()
不同。不需要 TCL API 来终止进程,这与
exit()
有什么不同?

如果您想从该函数返回并带有错误指示而不是中止,则只需返回 NULL - 返回值是 pointer 或对象,而不是对象本身,因此返回 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;
}

是否有相当于 exit(EXIT_FAILURE) 的 API C Tcl?

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.