我有这个功能:

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)

推荐答案

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

通过返回值报告错误与终止进程的exit()不同.不需要TclAPI来终止进程,这与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;
}

是否有一个API C Tcl等价于exit(EXIT_FAILURE)?

API是fully documented,其中有process termination 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;
}

C++相关问答推荐

有什么方法可以检测SunOS上的SparcWorks吗?

Zig将std.os.argv转换为C类型argv

为什么静态说明符为内联函数生成外部定义?

在Windows上构建无聊的SSL x64

为什么getchar()挂起了,尽管poll()返回了一个好的值?""

如何在C中只使用一个带双方括号([i][j])访问语法的malloc来分配动态大小的2d数组?

va_copy的使用是未定义的行为吗?

丑陋的三重间接:可扩展的缓冲区管理 struct

GLIBC:如何告诉可执行文件链接到特定版本的GLIBC

为什么sscanf不能正确地从这个字符串格式中提取所有数字?

fwrite无法写入满(非常大)缓冲区

Linux不想运行编译后的文件

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

致命错误:ASM/rwan ce.h:没有这样的文件或目录.符号链接还不够

如何在C中定义指向函数的指针并将该指针赋给函数?

分配给静态变量和动态变量的位置之间有区别吗?

在C中使用字符串时是否不需要内存分配?

变量的指针右对齐,函数的指针左对齐

与 C 相比,C++ 中无副作用的无限循环的好处是 UB?

仅使用其内存地址取消引用 C 中的 struct