iphone - 将 Xcode 更新到 5.1 时,EAGLView.mm 中出现错误 "Cast from pointer to smaller type ' int' 丢失信息 (5B130a)

标签 iphone xcode5 cocos2d-x ios7.1 cocos2d-x-2.x

昨天,我将 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/

相关文章:

c# - 表仅在真实设备上没有(公共(public))列

ios - 具有自动布局的多行UILabel,如何在不更改标签框架的情况下根据内容调整字体大小?

objective-c - Xcode 5 无法启动应用程序,错误为 : failed to launch '/path/to/.app' -- Busy

android - applicationDidEnterBackground + Director->stopAnimation() = 黑屏

cocos2d-iphone - cocos2d子类化 Sprite 来处理触摸?

iphone - iOS SplitView/Universal 帮助需要 xcode 4.2

iphone - 如何在 iOS (iPhone) 中使用 opencv 比较图像

ios - Apple 会接受仅使用 Xcode 5 构建的应用程序吗

ios - Xcode 5 自动布局并使 UIView 的宽度等于高度

android - eclipse +安卓+Cocos2d-x : Why does the emulation only work once?