c++ - C++ 程序使用的 C 库中的错误处理

标签 c++ c error-handling

我在 C++ 程序中使用 C 库(我也编写了该库),我想知道我应该如何从 C 库中进行错误处理,以便 C++ 程序能够决定如何处理可能发生的错误。

我最初让 C 库返回一个指示发生错误的值(例如 NULL 或 -1),并且只是向 stderr 打印一条错误消息,但这并不容易被使用该库的程序捕获。

理想情况下,我希望 C++ 程序能够从 C 库中检索错误消息字符串,以便它可以以任何方式处理错误,例如在其他地方记录错误消息。

这有一个共同的设计习惯吗?

最佳答案

所有需要全局状态(errno、get_last_error、...)的方法都会存在并发问题。使用返回 channel 会破坏您的返回值优化。

一个常见的选项是将指向错误结构的指针作为第一个或最后一个参数。

struct Error {
    const char* message;
    int         code;
};

int my_nice_c_function( int a, int b, Error* err ) {
    if ( err != NULL ) {
        err->message = "";
        err->code    = 0;
    }

    return a + b;
}

当你从 C++ 传入它们时,它可能看起来像:

Error err;
...
auto foo = my_nice_c_function( 5, 6, &err );
if ( err.code != 0 ) {
    std::cerr << err.message << std::endl;
}

但请确保始终设置错误成员!

关于c++ - C++ 程序使用的 C 库中的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61732897/

相关文章:

c++ - 使用 C++1 1's ' auto' 会降低性能甚至破坏代码吗?

c - 从文件中获取数据并将其添加到 C 中的链接列表中

python - 为什么我pyqt5告诉我,如果我知道这个小部件不存在?

javascript - 将函数分配给 window.onerror 比 window.addEventListener ('error' 回调更可取)?

javascript - 捕获Javascript中的图片特定错误

c++ - 温索克 : Windows networking programming in C++

c++ - if( !(s & i) ) 和 if( s&i == 0 ) 有什么区别?

c++ - 使用pgc++编译器禁用OpenACC隐式编译指示生成

c - scanf 没有第二次读取输入

c - 访问数组元素