我已经创建了一个带有可变参数(NSIntegers)的C函数,如下所示:
NSInteger test(NSInteger arg, ...)
{
va_list args;
va_start(args, arg);
NSInteger arg2 = va_arg(args, NSInteger);
return arg + arg2;
}
在使用负秒值调用此函数时,它会以某种方式变为非常大的数字。
test( 2, 2); // result = 4
test(-2, 2); // result = 0
test( 2, -2); // result = 4294967296
但是,如果我使用int而不是NSInteger作为可变参数,那么一切都按预期工作。
NSInteger test2(NSInteger arg, ...)
{
va_list args;
va_start(args, arg);
int arg2 = va_arg(args, int);
return arg + arg2;
}
试验:
test2( 2, 2); // result = 4
test2(-2, 2); // result = 0
test2( 2, -2); // result = 0
我可能在这里失踪或做错什么?如果有人能指出我在这里正确的方向,那就太好了。
谢谢!
答案 0 :(得分:4)
因为您将整数文字作为参数传递,所以在2
和-2
的情况下,这些将作为int
传递。因此,您尝试阅读NSInteger
来调用未定义的行为。
要解决此问题,请使用显式强制转换:
test(2, (NSInteger)-2);