这是我从谷歌的 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?