得到了一些好的答案,现在明白了一些实现可能足够疯狂,以至于实际写入一个公共共享缓冲区——在单线程内重入是不安全的,更不用说线程之间了!- 我的问题不再是“为什么我不能使用它,还有什么替代方案?” 到“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
,并且还显示一些调试信息。您可以根据需要对其进行调整。