Прежде чем хвалить C++23, разберёмся с тем, что встречается в каждом проекте.
errno — индикатор ошибки из мира C, и его всё ещё использует унаследованная C-часть стандартной библиотеки (<cmath>, семейство strto*, часть C-I/O).❌ Главная ловушка:
errno не сбрасывается при успехе. Проверять его «после» наугад бессмысленно — нужно обнулить до вызова.#include <cerrno>
#include <cstdlib>
errno = 0; // 1. сбросить
char* end = nullptr;
long v = std::strtol(str, &end, 10);
if (errno == ERANGE) return overflow(); // 2. проверить переполнение
if (end == str) return empty(); // 3. ничего не распарсилось
if (*end != '\0') return trailing(); // 4. мусор в хвосте: "123abc"
🩹 Типичные ошибки:
• забыли
errno = 0 перед вызовом• смотрят только на результат, игнорируя
ERANGE• думают, что
errno общий на все потоки (с C++11 он thread-local)💡 Превратить код в текст:
std::strerror(errno).❗️ В работе с C API
errno неизбежен, но в своём коде его стоит сразу заворачивать в std::error_code.📍Навигация: Вакансии • Задачи • Собесы
Библиотека C/C++ разработчика
#константная_правильность