GetLastError(), errno, FormatMessageA() и strerror_s()?

Я смущен относительно точной связи между GetLastError() и errno. Являются ли они одними и теми же численными значениями или что-то совершенно другое? Как узнать, какой из них я должен проверить?

И если я хочу преобразовать код ошибки в строку для отладки, могу ли я использовать FormatMessageA() взаимозаменяемо с strerror_s()?

Наконец, верно ли, что WSAGetLastError() всегда возвращает то же, что и GetLastError(), или они могут возвращать разные значения?

Ответ 1

Между GetLastError и errno нет никакой связи. GetLastError получает последнюю ошибку, возникающую в функции Windows API (для текущего потока). errno содержит последнюю ошибку, которая произошла в библиотеке времени выполнения C (я думаю, что это также зависит от потока для библиотеки времени выполнения Microsoft C). Поэтому, если вы вызываете функцию winapi, такую ​​как CreateFile, вы проверяете GetLastError (предполагая, что вызов функции завершился неудачно), а если вы вызываете функцию библиотеки времени выполнения C, например fopen, вы проверяете errno (опять-таки, что вызов был неудачным).

Я думаю, что также отвечает на вопрос об использовании FormatMessage и strerror_s.

Я не знаю, всегда ли WSAGetLastError возвращает те же значения, что и GetLastError (хотя я замечаю, что список кодов ошибок, возвращаемых GetLastError, включает коды ошибок, которые может возвращать WSAGetLastError). См. Коды системных ошибок (9000-11999). Если вы посмотрите на коды ошибок, начинающиеся примерно с 10000, вы увидите коды ошибок WSAGetLastError.

В любом случае, я лично не буду полагаться на них, возвращая те же значения. Почему это было бы полезно? Просто следуйте документации и вызовите WSAGetLastError для функций Winsock2 и GetLastError для других функций winapi. ПРИМЕЧАНИЕ. Вы можете использовать FormatMessage для кодов ошибок, возвращаемых любой из функций.