error_code: как установить и проверить errno - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь понять, какую категорию я должен использовать при вызове функции 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), не работает, если я не используюобщая категория.

Это ожидаемое поведение?

1 Ответ

0 голосов
/ 19 сентября 2018

Эта ошибка недавно исправлена ​​в последних выпусках GCC 6, 7 и 8.Это будет работать так, как вы ожидаете, если вы используете последний выпуск.Смотри https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60555.

...