比较提升::系统::error_category
Compare boost::system::error_category
对于输出"asio.misc"表示errorCode.category().name()和"file末尾"表示errorCode.message()的错误,以下比较失败
如果它声称属于类别asio.misc,那么为什么(errorCode.category() == boost::asio::error::misc_category)的if条件计算为false?
谷歌搜索(包括这里的答案)说 boost::system::error_code 可以在多个类别中具有相同的值,所以我假设为了获得正确的信息和含义,我们必须比较 boost::system::error_category 以及 boost::system::error_code::value。
如果这不起作用,我们如何正确比较类别?
有问题的代码:
//--------------------------------------------------------------------------------------------------
std::string ClientSocketASIO::ErrorCodeToString(const boost::system::error_code & errorCode)
{
std::ostringstream debugMsg;
debugMsg << " Error Category: " << errorCode.category().name() << ". "
<< " Error Message: " << errorCode.message() << ". ";
if( errorCode.category() == boost::asio::error::misc_category )
{
switch (errorCode.value())
{
case boost::asio::error::eof:
debugMsg << ". Server has disconnected.";
break;
case boost::asio::error::connection_refused:
debugMsg << ". Connection Refused";
break;
default:
debugMsg << ". Unknown Error.";
break;
}
}
else
{
debugMsg << ". Unknown Error category.";
}
return debugMsg.str();
}
编辑:
根据 https://theboostcpplibraries.com/boost.system 和提升::file_system:检查错误代码
人们通常错误地编写代码,只比较错误值而不是类别。错误值本身不是唯一的,可能会出现在多个类别中。用户还可以自由创建自己的错误代码和类别。因此,必须将两者进行比较。我认为这不会影响大量应用程序,因为它们无论如何都只使用一个功能或库来增强他们的项目和/或大多数错误代码映射到Windows错误代码,这些错误代码尽最大努力不发生冲突。
我不得不在另一台计算机上访问boost邮件列表,因为我的工作几乎阻止了所有内容。
http://boost.2283326.n4.nabble.com/Compare-boost-system-error-category-td4692861.html#a4692869
根据那边的一个家伙的说法,比较失败的原因是因为 boost 库是静态链接的,而 boost::system::error_category::operator == 比较地址,所以 LHS 是一个库中的地址,而 RHS 是另一个库中的地址。当人们期望它们平等时,它们不会是平等的。
使用运算符 == 的地址对我来说似乎是一个非常愚蠢的举动。我将继续在提升邮件列表中咆哮它,如果发现任何新知识,我会在这里为其他人编辑。
目前,我正在动态链接和使用表单
//--------------------------------------------------------------------------------------------------
std::string ClientSocketASIO::ErrorCodeToString(const boost::system::error_code & errorCode)
{
std::ostringstream debugMsg;
debugMsg << " Error Category: " << errorCode.category().name() << ". "
<< " Error Message: " << errorCode.message() << ". ";
// IMPORTANT - These comparisons only work if you dynamically link boost libraries
// Because boost chose to implement boost::system::error_category::operator == by comparing addresses
// The addresses are different in one library and the other when statically linking.
//
// We use make_error_code macro to make the correct category as well as error code value.
// Error code value is not unique and can be duplicated in more than one category.
if (errorCode == make_error_code(boost::asio::error::connection_refused))
{
debugMsg << ". Connection Refused";
}
else if (errorCode == make_error_code(boost::asio::error::eof))
{
debugMsg << ". Server has disconnected.";
}
else
{
debugMsg << ". boost::system::error_code has not been mapped to a meaningful message.";
}
return debugMsg.str();
}
但是,当我静态链接以提升时,这不起作用。如果有人对我们如何正确比较 boost::system::error_code 并获得预期结果有任何建议,请让我们深入了解这一点。
C++ 11 标准意味着每个错误类别实例应具有 全球唯一地址和平等比较应使用 要比较的地址。不幸的是,这在便携式中不可靠 代码,只有Dinkumware STL实现了真正的地址唯一性 在过程中的任何地方,它增加了一个完整的内存屏障来实现 也就是说,它很贵。
Boost的实现质量与libstdc++或libc++相同, 在某些情况下,您可以获得多个实例化,并且这些 可以有不同的地址。
在我自己的代码中,我首先执行比较运算符,如果失败,我 执行类别名称 () 的 strcmp()。到目前为止,这还没有咬我。 我个人认为错误类别的这一方面是一个 标准中的缺陷,如指定的那样,它强制非标头 如果您希望它符合要求,则实现,即使这样也没有 封面RTLD_LOCAL这意味着您需要回退到命名共享 记忆或一些黑客。
- "error: no matching function for call to"构造函数错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- C++错误:"error: int aaa::bbb is protected within this context"
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- C++ "error: invalid use of void expression"
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 如何修复"error: ‘_1’ was not declared in this scope"?
- 从不同目录执行时"symbol lookup error:",否则从构建目录执行时按预期工作
- 对象声明中的模板"error: expected expression"
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- OpenCV 3.4.1 error readNetFromTensorflow 无法在 cv::d nn::ReadProtoFromBinaryFile 中打开 .pb
- 已解决 - C++ 的崇高文本中的"fatal error: opencv: no such file or directory"
- 为什么我会"error: expected expression"?
- CMake Error at modules/videoio/cmake/detect_ffmpeg.cmake:16
- 如果两个静态库使用相同的另一个静态库,如何避免"LNK2005 Already Defined error"?
- 在 Objective-C++ -> EXC_BAD_ACCESS Error 中使用"new"关键字