いくつかの実装では、共通の共有バッファに実際に書き込むほど狂っているかもしれないことを理解しています。スレッド間での再入可能性はありません。 - 私の質問は「なぜ私はそれを使うことができないのですか?そして何が選択肢ですか? 「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
以外のエラーコードを指定できるほか、デバッグ情報も表示されます。あなたはあなたのニーズにそれを適応させることができます。
マイクロソフトでは「ISO C標準は卑劣である - 私たちはプラグマで警告またはエラーを無効にしない限り、使用することはできません」と述べているため、使用できません。 memcpy()も呼び出す前にmemcpy()を禁止しました。これは、コピーするバイト数と、それについて考えることができず、ターゲットスペースに十分な空きがあることをバイト数分知っているので、ばかげています。 CまたはC++でチーム作成コードに属していないとします。 –