2012-03-28 1 views
2

Я ожидаю, что следующий код для получения предупреждений о неявном объявлении функций:Не нужны ли прототипы сообщений и функций в clang 3?

@interface TestClass : NSObject 
@end 

@implementation TestClass 

- (void)foo { 
    NSString *test = [self bar]; 
    NSLog(@"%@", test); 
    test = baz(); 
    NSLog(@"%@", test); 
} 

- (NSString *)bar { 
    return @"bar"; 
} 

NSString *baz() { 
    return @"baz"; 
} 

@end 

В частности, я бы ожидать предупреждения об использовании как bar и baz, прежде чем они объявлены. (bar бы предположить, чтобы вернуться id и baz бы предположить, чтобы вернуться int.)

GCC показывает как предупреждения, так же как и в LLVM Clang 2.9. Однако Clang 3, по-видимому, может обнаружить, что существуют bar и baz и что они возвращают. Не появляется предупреждение (если функции не удалены).

(Когда baz объявлен вне класса, предупреждение по-прежнему происходит. Таким образом, это относится только к Objective-C!)

Awesome! Это позволит удалить много дубликатов. Но что происходит? Является ли это расширением языка? Это функция компилятора? Это ошибка? Или я ошибаюсь об этом? Я не мог найти документацию по этому поводу, поэтому я опасаюсь полагаться на это. У кого-нибудь есть понимание?

+0

Просто возьмите это как есть - удивительный! Теперь, если они могут просто исправить LLDB .... –

ответ

2

Документация iOS 6 (теперь из NDA), наконец, содержит официальное подтверждение этой функции.

Он называется «Нет прототипов метода вперед, необходимых в блоке @implementation», требуется Xcode 4.3 (LLVM Compiler 3.1) и совместим со всеми выпусками iOS.

Objective-C Feature Availability Index

этой странице перечислены все последние усовершенствования в компиляторе и Objective-C и при каких constellatons они доступны.

1

Это появилось в списке Apple несколько недель назад. Это новая функция. Есть некоторые другие вещи, поставляемая вместе, как:

NSArray* myArray = @[ @"foo", @"bar", @"baz"]; 

как синтаксический сахар для

NSArray* myArray = [NSArray arrayWithObjects: @"foo", @"bar", @"baz", nil]; 

(ну это не совсем прямой перевод).

Кроме того, я думаю, что там будет

array[i] 

для

[array objectAtIndex: i]; 

и будут эквивалентные расширения для словарей.

+0

Существует сообщение SO о литеральном синтаксисе: http://stackoverflow.com/questions/9693647/is-there-some-literal-dictionary-or-array-syntax- в-Objective-C –

 Смежные вопросы

  • Нет связанных вопросов^_^