c++ - 在 C++ 中使用错误代码的更好方法是什么?

标签 c++ c++11 return-value return-type rvo

我是使用 c++11 的项目的成员。我不确定什么时候应该使用错误代码作为返回值。我发现即使直接返回 stringstruct 数据,C++ 中的 RVO 也能很好地工作。但是如果我使用返回码,我就无法获得 RVO 的好处并且代码有点多余。

所以每次声明函数时,我都无法决定应该使用哪个作为返回值。我应该如何保持代码的一致性?任何建议都会对我有所帮助。

// return string
MyError getString(string& out);
string getString();

// return struct
MyError getStructData(MyStruct& out);
MyStruct getStructData();

最佳答案

通常,使用异常而不是错误代码是 C++ 中的首选替代方案。这有几个原因:

  • 正如您已经观察到的,使用错误代码作为返回值会阻止您将返回值用于更“自然”的东西
  • 全局错误代码,不是线程安全的,还有其他几个问题
  • 错误码可以忽略,异常不能
  • 必须在每次可能失败的函数调用后评估错误代码,因此您必须在代码中乱放错误处理逻辑
  • 异常可以被抛出并在调用堆栈中向上传递几层而无需额外处理

当然也有异常(exception)情况不可用的环境,通常是由于平台限制,例如在嵌入式编程中。在这些情况下,错误代码是唯一的选择。

但是,如果您使用错误代码,请与您传递错误代码的方式保持一致。我见过的最吸引人的错误代码使用不占用返回值位置并且仍然是线程安全的,是在每个函数中传递对上下文对象的引用。上下文对象将具有全局或每线程信息,包括最后一个函数的错误代码。

关于c++ - 在 C++ 中使用错误代码的更好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32062525/

相关文章:

c++ - 我怎样才能返回一个数组?

xml - 如何使用xpath从节点获取属性值?

c++ - 在这种情况下,C++ 中的 union 做了什么?

c++ - 可以使用 __syncthreads() 合并单独的 CUDA 内核吗?

c++ - 如何使用邻接表表示具有虚拟顶点的图?

c++11 - C++11 的显式关键字和多参数构造函数

c++ - 在共享内存中移动 boost::interprocess::string

c++ - 没有指定模板参数但仍然有效

c++ - 复制和粘贴 .so 文件不适用于链接器

c - 像下面这样使用 exec() 的函数的返回值是多少?