我最近在編譯iOS應用程序時從LLVM GCC 4.2切換到LLVM 3.0編譯器。一切似乎都一樣,除了我的一些switch語句。在開關條件下直接使用Obj-C方法時,看起來有些問題。LLVM 3.0上的switch語句出現意外的行爲
我已經創建了下面的main.m文件來重現這一點。它打印property: 846
,而它應該清楚地打印property: 2
。我的開關使用有什麼問題嗎?或者這可能是編譯器中的錯誤?
#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];
}
UPDATE:
要清楚我是怎麼編譯代碼:
- 我使用的Xcode 4.2和iOS SDK 5.0的Mac OS X 10.6.8
- 使用LLVM 3.0
- 用-Os編譯代碼(也嘗試過-O1)
- 構建arvm7並在iOS 4.2.1上測試iPad(也嘗試使用iOS 5.0的iPhone 4)
使用中斷可能是因爲你改變了我的類型值,如果你改變了一個case中的值,break會檢查另一個case。 – Radu 2012-02-29 11:52:10
@Radu:切換塊中的'return'是完全合法的。不知道你在改變類型。 – pmdj 2012-02-29 12:28:56