error_code: como configurar e verificar errno
Estou tentando entender qual categoria devo usar ao chamar uma função C que defineerrno
no Linux.
Não tenho certeza de que todos os códigos de erro possíveis sejam definidos, multados pelo POSIX, por isso estou tentado a usar osystem_category
.
Mas eu gostaria de lidar com condições genéricas no meu código mais tarde, então gostaria de fazer coisas assim:
std::error_code ec;
some_func(some_path, ec);
if (ec) {
if (ec == std::errc::file_exists) {
// special handling
}
return ec;
}
Para definir o código de erro emsome_func()
, Esperava continuar assim:
ec.assign(EEXIST, std::system_category());
Basicamente baseado nesta discussão:
categorias <system_error> e códigos de erro padrão / do sistemaE o exemplo de código fornecido por @ 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())
-https://stackoverflow.com/a/40063005/951426
No entanto, no Linux, com o GCC 6.1.1, tenho:
std::error_code(EEXIST, std::system_category()) == std::errc::file_exists
retornafalse
std::error_code(EEXIST, std::generic_category()) == std::errc::file_exists
retornatrue
Eu esperava que o errno + system_category fosse comparável aostd::errc
condições.
Isso significa que meu código inicial que verificaif (ec == std::errc::file_exists)
não funciona se eu não usar a categoria genérica.
Este é o comportamento esperado?