【发布时间】:2018-09-18 10:30:28
【问题描述】:
我试图了解在 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());
主要基于这个讨论:
- <system_error> categories and standard/system error codes
- 以及@niall-douglas 提供的代码示例:
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) 的初始代码将不起作用。
这是预期的行为吗?
【问题讨论】:
-
也许你可以简单地使用 std::make_error_code(EEXIST) ?
-
无法编译:
error: no matching function for call to ‘make_error_code(int)’. -
发件人:en.cppreference.com/w/cpp/error/errc。看来您应该使用 std::make_error_code(std::errc::file_exists);或类似的东西。
-
我以 EEXIST 为例,但在实践中我从 errno 获取值。我做不到
std::make_error_code(errno)。我想避免在所有 errno 值上编写 switch-case,因为我假设系统和通用类别已经这样做了。
标签: c++ linux c++11 error-code