MSVC的string.h
里也有strerror()
函数,但只是个样子货,与Windows的GetLastError()
返回的错误码毫不相干,这里使用FormatString()
包装成兼容的函数。
我的方式相比于别的烂大街文章,有两个不同:一是使返回的字符串在下次调时能够正确地被LocalFree()
,二是FormatString()
可能返回NULL
,需要作判断。经测试,没有内存泄漏和空指针问题。
注意不要取strerror
或_strerror
,会重名,以下是实现代码:
static char *_serr(DWORD _errno) {
static char *msg = 0;
int i, msglen;
if (msg) {
LocalFree(msg);
msg = 0;
}
FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, _errno, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPSTR)&msg, 0, NULL);
if (msg) {
msglen = strlen(msg);
for (i = msglen - 1; i >= 0 && i >= (msglen - 2); i--) {
if (msg[i] == '\r' || msg[i] == '\n') {
msg[i] = '\0';
}
}
return msg;
} else {
return "Unknown error";
}
}
以下是测试代码:
int main(int argc, char **argv) {
int i;
while (1) {
for (i = 0; i < 100; i++) {
printf("%03d: %s %s\n", i, _serr(i), strerror(i));
}
Sleep(1000);
}
}
可以看出与自带的strerror()
输出的不同,以及用任务管理器可以看出没有内存泄漏。