【发布时间】:2021-08-21 16:06:39
【问题描述】:
当从另一个 dll 或可执行文件接收到 asio::error_code 值时,我在处理它们时遇到了问题。例如,我可以使用处理程序运行异步操作:
socket.async_receive([](const asio::error_code& errorCode)
{
if (errorCode == asio::error::operation_aborted)
return;
}
如果处理程序是在 dll 中创建的,并且 errorCode 是从另一个 dll 或可执行文件传递的,operator== 将返回 false,因为它们的 error_category 值不同。例如:
(gdb) info sym 0x55f1c0
asio::system_category()::instance in section .data of C:\dev\builds\UWCASdk\Debug-MinGW-w64\Sandbox\ServerL410F\bin\sb.ServerL410F.exe
(gdb) info sym 0x6f0420d0
asio::system_category()::instance in section .data of C:\dev\builds\UWCASdk\Debug-MinGW-w64\Sandbox\ServerL410F\bin\libproviders.protobuf.client_d.dll
显然,这两个实例是在不同的单元中定义的,我基本上有 ODR 违规。
instance 在asio/impl/error_code.ipp 中定义:
const error_category& system_category()
{
static detail::system_category instance;
return instance;
}
ASIO 文档在处理错误时没有提到任何关于 error_cateegory 的内容 - 它只指定枚举值,因此使用 errorCode.value == asio::error::operation_aborted 似乎是一种有效的解决方法。但这仍然看起来很丑。
- 是否可以按预期比较跨 dll 的错误(
operator==重载)? - 仅将
errorCode.value()与枚举进行比较是正常的还是预期的?
【问题讨论】:
标签: c++ dll error-handling boost-asio asio