【发布时间】:2018-12-09 05:30:11
【问题描述】:
传统的strtol()通常是这样使用的:
int main()
{
errno = 0;
char *s = "12345678912345678900";
char *endptr;
long i = strtol(s, &endptr, 10);
if(i == LONG_MAX && errno == ERANGE)
printf("overflow");
}
我们需要访问errno 两次,而现在errno 通常是一个C 宏最终扩展为一个函数。考虑到将字符串解析为整数并不是一项繁重的工作,这似乎有点贵。
那么,在没有errno 的情况下实现strtol 而是使用其他方式来指示溢出是否更好?
喜欢:
long strtol(const char *nptr, char **endptr, int base, bool *is_overflow);
而不是
long strtol(const char *nptr, char **endptr, int base);
【问题讨论】:
-
我不确定问题是什么。你不实现 strtol,你使用它。您是在问是否应该重新实现 strtol 以使其不使用 errno?
-
我相信 Posix 需要
errno所以它不是真的可行。此外,您将把大部分时间花在转换算法上。转换可能在O(n)中运行。设置errno在O(1)中运行。设置errno几乎是微不足道的。 -
如果没有
errno,怎么知道没有溢出? -
@ShmuelH。它是一个左值(一个返回指针的函数,伪装成一个变量。)
-
相关,这里是libc的
strtol.cimplementation