лучше ли реализовывать strtol без errno ...
Нет.
... но использовать другие способы указания переполнения?
Нет.
long int strtol(const char * restrict nptr, char ** restrict endptr, int base);
strtol()
- это стандартная функция библиотеки C, и любая реализация должна придерживаться правильного использования 3-х входов и errno
, чтобы соответствовать.
Конечно, OP может реализовывать некоторые другие my_strtol()
по желанию.
Любые проблемы с производительностью, связанные с отказом от errno
, являются микрооптимизацией, но при этом разумной целью проектирования.* Это действительно сводится к тому, как передать проблемы строки в long
Переполнение "12345678912345678901234567890"
Без преобразований "abc"
Избыточный мусор "123 abc"
Разрешены начальные пробелы, разрешены пробелы?
Разрешить различные базы?
После определения функциональности во всех исключительных случаях, а не просто переполнения, полезны проблемы кодирования относительно errno
, даже если вряд ли внесет какие-либо существенные улучшения производительности.
IMO, кодирование только на одну базу, скорее всего, более продуктивный путь к повышению скорости, чем errno
.
OP-код не является надежным strtol()
использованием.Предложить:
char *s = "12345678912345678900";
char *endptr;
errno = 0;
long i = strtol(s, &endptr, 10);
if (errno == ERANGE) printf("Overflow %ld\n", i);
else if (s == endptr) printf("No conversion %ld\n", i);
else if (*endptr) printf("Extra Junk %ld\n", i);
else printf("Success %ld\n", i);