Имея несколько хороших ответов и теперь понимая, что некоторые реализации могут быть достаточно сумасшедшими, чтобы фактически записывать в общий разделяемый буфер - небезопасно входить в один поток, не говоря уже о потоках! - мой вопрос перестает быть «Почему я не могу его использовать, и каковы альтернативы?» «Есть ли достойные, лаконичные альтернативы в C и / или C ++?»
Posix указывает strerror_r()
, а в Windows вы можете использовать strerror_s()
, что немного отличается, но имеет ту же цель. Я делаю это:
#define BAS_PERROR(msg, err_code)\
bas_perror(msg, err_code, __FILE__, __LINE__)
void bas_perror (const char* msg, int err_code, const char* filename,
unsigned long line_number);
void
bas_perror (const char* usr_msg, int err_code, const char* filename,
unsigned long line_number)
{
char sys_msg[64];
#ifdef _WIN32
if ( strerror_s(sys_msg, sizeof sys_msg, err_code) != 0 )
{
strncpy(sys_msg, "Unknown error", taille);
sys_msg[sizeof sys_msg - 1] = '\0';
}
#else
if ( strerror_r(err_code, sys_msg, sizeof sys_msg) != 0 )
{
strncpy(sys_msg, "Unknown error", sizeof sys_msg);
sys_msg[sizeof sys_msg - 1] = '\0';
}
#endif
fprintf(stderr, "%s: %s (debug information: file %s, at line %lu)\n",
usr_msg, sys_msg, filename, line_number);
}
Я написал эту функцию, потому что функции потоков Posix не изменяют errno
, вместо этого они возвращают код ошибки. Так что эта функция в основном такая же, как perror()
, за исключением того, что она позволяет вам предоставить код ошибки, отличный от errno
, а также отображает некоторую информацию об отладке. Вы можете адаптировать его под свои нужды.