いくつかの良い答えがあり、いくつかの実装が実際に共通の共有バッファーに書き込むのに十分クレイジーである可能性があることを理解しました-シングルスレッド内での再入可能性は安全ではありません。スレッド間は気にしないでください! -私の質問は、「なぜそれを使用できないのか、代替手段は何ですか?」ではなくなります。「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
デバッグ情報も表示できる点が異なります。必要に応じて調整できます。