gpt4 book ai didi

c - 错误 C3861 : 'strtoll' : identifier not found

转载 作者:行者123 更新时间:2023-12-03 21:30:11 25 4
gpt4 key购买 nike

我在这里面临的主要问题是 strtoll() 在 VC 2010 中被标记为错误(error C3861: 'strtoll': identifier not found)。如果我用 strtol() 替换它,它会做同样的事情吗?

unsigned int get_uintval_from_arg(int argc, int index, char **argv,
unsigned int lower_bound, unsigned int upper_bound)
{
unsigned int return_val=0;

if (index + 1 <= argc - 1)
{
return_val=(unsigned int)strtoll(argv[index+1],NULL,10);
if (errno == EINVAL || errno== ERANGE)
{
fprintf(stderr, "Could not parse argument %s for switch %s!\n",
argv[index], argv[index+1]);
return 0;
}
}
// ....... I will post the remaining part of the code if necessary
.......
}

最佳答案

由于您的 return_val是一个 unsigned int , 你可能应该使用 strtoul()自 C89 以来一直是标准,因此受 MSVC 支持(而 strtoll() 自 C99 以来一直是标准,不受 MSVC 支持)。

您对错误条件的测试不充分。你需要设置 errno在调用转换函数之前归零;您还需要检测是否报告了错误,这比看起来要棘手。

C99 标准的第 7.20.1.4 节“strtol、strtoll、strtoul 和 strtoull 函数”说:

Returns

The strtol, strtoll, strtoul, and strtoull functions return the converted value, if any. If no conversion could be performed, zero is returned. If the correct value is outside the range of representable values, LONG_MIN, LONG_MAX, LLONG_MIN, LLONG_MAX, ULONG_MAX, or ULLONG_MAX is returned (according to the return type and sign of the value, if any), and the value of the macro ERANGE is stored in errno.

您还必须阅读存储在 endptr 中的值。转换函数的参数,以告知未执行任何转换(与转换有效零相反)。

If the subject sequence is empty or does not have the expected form, no conversion is performed; the value of nptr is stored in the object pointed to by endptr, provided that endptr is not a null pointer.

因此,您必须编写更像这样的代码(省略针对 EINVAL 的测试,因为标准没有提到这些将 errno 设置为 EINVAL 的函数):

unsigned int return_val=0;

if (index + 1 <= argc - 1)
{
char *end;
unsigned long ul;
errno = 0;
ul = strtoul(argv[index+1], &end, 10);
if ((ul == 0 && end == argv[index+1]) ||
(ul == ULONG_MAX && errno == ERANGE) ||
(ul > UINT_MAX))
{
fprintf(stderr, "Could not parse argument %s for switch %s!\n",
argv[index], argv[index+1]);
return 0;
}
retval = (unsigned int)ul;
}

请注意,这比必须考虑负值 <type>_MIN 的有符号整数转换测试更简单限制以及<type>_MAX限制。

另请注意,您确实应该将结果记录在 unsigned long 中。然后检查它是否适合您指定的范围,该范围可能限制为 UINT_MAX(在类 Unix 64 位环境中可以小于 ULONG_MAX)。

关于c - 错误 C3861 : 'strtoll' : identifier not found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8239013/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com