昨天,我将 Xcode 更新到最新版本 (5.1 (5B130a))
以兼容 iOS 7.1
。然后我构建项目,在 EAGLView.mm
文件中出现错误 “从指针转换为较小类型 'int' 会丢失信息”
(第 408 行
) code>) 当选择 64 位模拟器(例如:iPhone Retina 4 英寸 64 位)时。
我正在使用cocos2d-x-2.2.2
。在更新 Xcode 之前,我的项目仍然可以在所有设备上正常构建和运行。
感谢大家的推荐。
更新:今天,我下载了最新版本的cocos2d-x(cocos2d-x 2.2.3)。但问题还是发生了。
这是发生该错误的一些代码:
/cocos2d-x-2.2.2/cocos2dx/platform/ios/EAGLView.mm:408:18:从指针转换为较小的类型“int”会丢失信息
// Pass the touches to the superview
#pragma mark EAGLView - Touch Delegate
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
if (isKeyboardShown_)
{
[self handleTouchesAfterKeyboardShow];
return;
}
int ids[IOS_MAX_TOUCHES_COUNT] = {0};
float xs[IOS_MAX_TOUCHES_COUNT] = {0.0f};
float ys[IOS_MAX_TOUCHES_COUNT] = {0.0f};
int i = 0;
for (UITouch *touch in touches) {
ids[i] = (int)touch; // error occur here
xs[i] = [touch locationInView: [touch view]].x * view.contentScaleFactor;;
ys[i] = [touch locationInView: [touch view]].y * view.contentScaleFactor;;
++i;
}
cocos2d::CCEGLView::sharedOpenGLView()->handleTouchesBegin(i, ids, xs, ys);
}
最佳答案
显然,Xcode 5.1 及更高版本中的 clang 版本对于源代码中潜在的 32 位与 64 位不兼容性比旧的 clang 版本更加严格。 说实话,我认为 clang 这里限制太多了。一个理智的编译器可能会在这样的行上抛出警告,但绝不应该抛出错误,因为这段代码没有错误,它只是可能容易出错,但可以完全有效。
原代码为
ids[i] = (int)touch;
其中 ids 是一个整数数组,touch 是一个指针。
在 64 位构建中,指针是 64 位(与 32 位构建相反,指针是 32 位),而 int 是 32 位,因此此分配将 64 位值存储在 32 位存储中,这可能会导致信息丢失.
因此,编译器对于像这样的行抛出错误是完全有效的
ids[i] = touch;
然而,有问题的实际代码包含显式的 c 风格强制转换为 int。这个显式转换清楚地告诉编译器“闭嘴,我知道这段代码看起来不正确,但我确实知道我在做什么”。
所以编译器在这里非常挑剔,正确的解决方案是让代码再次编译并仍然让它显示与 Xcode 5.0 中完全相同的行为,即首先转换为大小与 a 的大小相匹配的整数类型。指针,然后第二次转换为我们实际想要的 int:
ids[i] = (int)(size_t)touch;
我在这里使用 size_t,因为无论平台如何,它始终具有与指针相同的大小。 long long 不适用于 32 位系统,而 long 不适用于 64 位 Windows(而 64 位 Unix 和类 Unix 系统(如 OS X)使用 LP64 数据模型,其中 long 为 64 位,64 位 Windows 使用 LLP64 数据模型,其中 long 的大小为 32 位 ( http://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models ))。
关于iphone - 将 Xcode 更新到 5.1 时,EAGLView.mm 中出现错误 "Cast from pointer to smaller type ' int' 丢失信息 (5B130a),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22419063/