【问题标题】:Unexpected behavior with switch statements on LLVM 3.0LLVM 3.0 上 switch 语句的意外行为
【发布时间】:2012-03-01 03:42:37
【问题描述】:

我最近在编译 iOS 应用程序时从 LLVM GCC 4.2 切换到 LLVM 3.0 编译器。一切似乎都一样,除了我的一些 switch 语句。在 switch 条件中直接使用 Obj-C 方法时似乎有问题。

我在下面创建了 main.m 文件来重现这个。它正在打印property: 846,而它应该清楚地打印property: 2。我对 switch 的使用有什么问题吗?或者这可能是编译器中的错误?

#import <Foundation/Foundation.h>

@interface STSomeClass : NSObject
@end

@implementation STSomeClass

- (int)mytype{
  return 2;
}

- (int)someProperty{
  switch ([self mytype]) {
    case 1:
    case 2:
    case 3: 
    case 6: 
    case 8:
    case 9:
        return 2;
    case 4:
    case 7:
        return 1;
    default:
        return 0;
  }
}

- (void)printSomeProperty{
  printf("property: %d\n", [self someProperty]);
}

@end

int main(int argc, char *argv[])
{
  STSomeClass* someObject;

  someObject = [[STSomeClass alloc] init];
  [someObject printSomeProperty];
  [someObject release];
}

更新

为了弄清楚我是如何编译代码的:

  • 我在 Mac OS X 10.6.8 上使用 Xcode 4.2 和 iOS SDK 5.0
  • 使用 LLVM 3.0
  • 用 -Os 编译代码(也试过 -O1)
  • 为 arvm7 构建并在装有 iOS 4.2.1 的 iPad 上进行测试(还尝试了装有 iOS 5.0 的 iPhone 4)

【问题讨论】:

  • 使用中断这可能是您更改了 my type 值的事实,如果您更改 casewhitout break 中的值,它将检查另一种情况。
  • @Radu: returns 在 switch 块中是完全合法的。不知道你在改变类型。

标签: objective-c ios llvm


【解决方案1】:

我以两种方式尝试了这段代码:Xcode 4.4、llvm 4.0、ARC 和 Xcode 4.3、llvm 3,1 no-ARC 都使用 OS X 10.7.3、iOS 4.3 目标和 iOS 5.0。模拟器并两次获得“属性:2”。

所以,你的情况还有其他事情发生。您使用的具体配置是什么?

【讨论】:

  • 对不起,我忘了提。我正在 iPad 上测试它(也在 iPhone 4 上测试)并使用 -Os 标志进行编译。
  • 看来我无法下载 Xcode 4.4 并使用 llvm 4.0 进行测试。是否只有 Mac 开发者可以访问?
  • 我试过 -Os,在运行 iSO 5.0.1 的 iPad2 上仍然得到正确的结果。不过,缺少自动释放池确实让我担心。
  • 感谢您的尝试。这似乎与我的配置非常接近。我想知道为什么我看到不同的结果。我删除了 @autoreleasepool 块只是为了使用 LLVM GCC 4.2 编译器对其进行测试。添加它没有任何区别。
  • 当 3.1 仍在开发中并且最新的是 3.0 时,您到底从哪里获得 LLVM 4.0?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
相关资源
最近更新 更多