在调用在Linux上设置errno
的C函数时,我试图了解应该使用的类别。
我不确定POSIX是否定义了所有可能的错误代码,所以我很想使用system_category
。
但是我以后想在代码中处理通用条件,所以我想做这样的事情:
std::error_code ec;
some_func(some_path, ec);
if (ec) {
if (ec == std::errc::file_exists) {
// special handling
}
return ec;
}
要在some_func()
中设置错误代码,我希望这样进行:
ec.assign(EEXIST, std::system_category());
主要基于此讨论:
std::error_code ec; if(-1 == open(...)) ec = std::error_code(errno, std::system_category()); // To test using portable code if(ec == std::errc::no_such_file_or_directory) ... // To convert into nearest portable error condition (lossy, may fail) std::error_condition ec2(ec.default_error_condition())
但是,在Linux上,使用GCC 6.1.1,我有:
std::error_code(EEXIST, std::system_category()) == std::errc::file_exists
返回false
std::error_code(EEXIST, std::generic_category()) == std::errc::file_exists
返回true
我期望errno + system_category可与std::errc
条件相提并论。
这意味着如果我不使用通用类别,则检查if (ec == std::errc::file_exists)
的初始代码将无法正常工作。
这是预期的行为吗?
答案 0 :(得分:4)
This is a bug recently fixed in latest GCC 6, 7 and 8 point releases. It'll work as you expect if you're on the latest point release. See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60555.