【问题标题】:Are message and function prototypes no longer necessary in clang 3?clang 3 中是否不再需要消息和函数原型?
【发布时间】:2012-03-28 15:54:17
【问题描述】:

我希望以下代码会产生有关函数隐式声明的警告:

@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

具体来说,我希望在声明之前会收到有关使用 barbaz 的警告。 (bar 将被假定返回 idbaz 将被假定返回 int。)

GCC 会显示这两个警告,LLVM 的 Clang 2.9 也是如此。然而,Clang 3 显然可以找出 barbaz 的存在以及它们返回的内容。 不会出现警告(除非功能被移除)。

(当baz在类外声明时,警告仍然出现。所以这只适用于Objective-C!)

太棒了!这将允许删除大量重复。但这是怎么回事?这是语言扩展吗?它是编译器功能吗?它是一个错误吗?还是我对此有误?我找不到任何关于此的文档,所以我对依赖它持谨慎态度。 有人有什么见解吗?

【问题讨论】:

  • 就这样吧——太棒了!现在,如果他们能修复 LLDB....

标签: objective-c xcode warnings llvm clang


【解决方案1】:

iOS 6 文档(现已退出 NDA)终于包含了对该功能的官方确认。

它被称为“@implementation 块中不需要前向方法原型”,需要 Xcode 4.3 (LLVM Compiler 3.1) 并且兼容所有 iOS 版本。

Objective-C Feature Availability Index

该页面列出了编译器和 Objective-C 的所有最新改进以及它们在哪些星座下可用。

【讨论】:

    【解决方案2】:

    这在几周前出现在 Apple 列表中。这是一个新功能。还有一些其他的事情,比如:

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

    作为

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

    (好吧,这不是直接翻译)。

    另外,我认为会有

    array[i]
    

    [array objectAtIndex: i];
    

    并且会有等效的字典扩展。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-02
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 2018-01-04
    • 2019-05-27
    • 1970-01-01
    相关资源
    最近更新 更多