Я пытаюсь понять, какую категорию я должен использовать при вызове функции C, которая устанавливает errno
в Linux.
Я не уверен, что все возможные коды ошибок определены в POSIX, поэтомуЯ испытываю желание использовать system_category
.
Но я хотел бы позже обработать общее условие в своем коде, поэтому я хотел бы сделать такие вещи:
std::error_code ec;
some_func(some_path, ec);
if (ec) {
if (ec == std::errc::file_exists) {
// special handling
}
return ec;
}
Toустановите код ошибки в 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())
- https://stackoverflow.com/a/40063005/951426
Однако в 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)
, не работает, если я не используюобщая категория.
Это ожидаемое поведение?