0

这是我从谷歌的 gflags 源代码中读到的代码片段

case FV_INT32: {
  const int64 r = strto64(value, &end, base);
  if (errno || end != value + strlen(value))  return false;  // bad parse
  if (static_cast<int32>(r) != r)  // worked, but number out of range
    return false;
  SET_VALUE_AS(int32, static_cast<int32>(r));
  return true;
}

和宏定义 strto64

// Work properly if either strtoll or strtoq is on this system
#ifdef HAVE_STRTOLL
# define strto64  strtoll
# define strtou64  strtoull
#elif HAVE_STRTOQ
# define strto64  strtoq
# define strtou64  strtouq
#else
// Neither strtoll nor strtoq are defined.  I hope strtol works!
# define strto64 strtol
# define strtou64 strtoul
#endif

显然,作者更喜欢 strtoll 而不是 strtol。根据这两个函数的手册页,一个返回long long int,另一个返回long int。如果您只想要一个 int32,它们都可以,对吧?

那么这两个函数有什么区别呢?为什么首选 strtoll?

4

2 回答 2

1

您的问题实际上是:“strto64当标志为 时,为什么在这里使用FV_INT32?”:

strto64由于此检查,此代码似乎更喜欢:

if (static_cast<int32>(r) != r)

所以它首先尝试尽可能多地吞下这个数字,因此strto64. 之后,它可以轻松地检查它是否适合 32 位。


About strtoll:long long保证至少 64 位宽。所以喜欢它是有道理的strto64

于 2014-03-08T06:08:10.613 回答
0

在支持long long int的系统上,它至少是一个 64 位整数。另一方面,保证long int它至少是一个 32 位整数。在某些系统/某些编译器上,long int是 64 位整数。在其他情况下,它只有 32 位。Google 标头希望 along int在不提供的系统上确实是 64 位,strtoll否则strtoq无法将字符串转换为long long int.

于 2014-03-08T06:17:27.757 回答