2

clang 和 gcc 是否可以选择禁止向对象发送未定义消息的警告?如果是这样,标志是什么?

使用铿锵声3.1:

test.mm:51:14: warning: instance method '-dfs_path:' not found (return type defaults to 'id')
            ([pathfinder dfs_path: graph, @[ NUM(start) ], NUM(goal), NUM(max_steps)])
            ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

使用 gcc 4.2.1:

test.mm: In function ‘void test_path(objc_object*, objc_object*, int, int, int, BOOL)’:
test.mm:84: warning: no ‘-dfs_path:’ method found
test.mm:84: warning: (Messages without a matching method signature
test.mm:84: warning: will be assumed to return ‘id’ and accept
test.mm:84: warning: ‘...’ as arguments.)
test.mm:84: warning: no ‘-dfs_path:’ method found

基本上,有问题的方法是在 MacRuby 中生成的,因此 Objective C 编译器在编译时并不知道它们。

4

2 回答 2

2

我在 Xcode 中发出的大部分来自 clang 的警告都带有关于在警告消息本身中解决该特定警告的信息。如果您正在手动运行 clang(或者没有看到这些),则可以使用 clang 选项来打开此行为:

-f[no-]diagnostics-show-option

如果您-fdiagnostics-show-option用作编译器选项,那么您应该会看到警告中列出的选项,例如:

foo.m:73:1: warning: category is implementing a method which will also be implemented by its
            primary class [-Wobjc-protocol-method-implementation]

这表明该-Wobjc-protocol-method-implementation选项导致错误,并且添加-Wno-objc-protocol-method-implementation通常会禁用它。

话虽如此,我建议不要关闭未定义方法的警告,方法定义会影响编译器处理返回值的方式,这会给你以后带来很多麻烦。

如果您没有适当的包含文件,您始终可以使用类别为该方法声明一个本地定义。不是最干净的方式(包括声明),但有时是必要的。

@interface class_you_are_having_issues_with ()
- (id)dfs_path: (id)unknownarg, ...
@end

顺便说一句,我假设这是一个可变参数方法,因为这是您在 Objective-C 中使用逗号分隔的 args 的唯一一次。

希望这将在两个方面为您指明正确的方向。

于 2012-05-06T18:08:57.077 回答
0

尝试-Wno-objc-method-access- 在铿锵声中为我工作。

于 2015-12-02T12:50:49.140 回答