Objective c if语句中的赋值警告?

Objective c if语句中的赋值警告?,objective-c,xcode,Objective C,Xcode,当我赋值变量而不是检查相等时,有没有办法得到警告?有很多次我不小心分配了,而不是比较了,如果有一个警告就好了 Xcode是否有一种方法可以警告我,而不必将编码样式更改为: if (YES == aVariable) {...} 编译器标志Wparentheses应该起作用。它将强制您在条件中的赋值周围放置括号,以便进行编译。默认情况下,Clang设置了此标志。Xcode已经警告您在大多数情况下,如果在if语句中使用=而不是=。如果您没有收到警告,请告诉我们您正在使用的Xcode版本、您的项目有

当我赋值变量而不是检查相等时,有没有办法得到警告?有很多次我不小心分配了,而不是比较了,如果有一个警告就好了

Xcode是否有一种方法可以警告我,而不必将编码样式更改为:

if (YES == aVariable) {...}

编译器标志
Wparentheses
应该起作用。它将强制您在条件中的赋值周围放置括号,以便进行编译。默认情况下,Clang设置了此标志。

Xcode已经警告您在大多数情况下,如果在
if
语句中使用
=
而不是
=
。如果您没有收到警告,请告诉我们您正在使用的Xcode版本、您的项目有多旧,以及您从默认设置更改了哪些生成设置

我的测试:我在Xcode 4.5.2中创建了一个全新的iOS应用程序,并且没有更改任何构建设置。我刚刚向
应用程序:didfishlaunchingwithoptions:
添加了一些代码来触发警告。这是:

您可以通过设置编译器的
-Wno括号
标志来禁用警告(但为什么要禁用?)。通过在指定周围添加一组额外的括号,可以在特定情况下抑制警告:

if ((x = 7)) {
有两种情况下,默认情况下您不会得到警告。首先,在
init
方法中,您可以分配给
self
,如下所示:

- (id)init {
    if (self = [super init]) {     // no warning by default
    ...
while (object = [enumerator nextObject]) {    // no warning by default
其次,在任何上下文中,都可以指定
nextObject
选择器的结果,如下所示:

- (id)init {
    if (self = [super init]) {     // no warning by default
    ...
while (object = [enumerator nextObject]) {    // no warning by default

在这些情况下,您可以通过设置编译器的
-Widiomatic圆括号
标志来启用警告。

默认情况下,clang还没有这样做吗?是的,默认情况下,我将其设置为well@Pfitz谢谢Will do,我不知道这一点。@n检查并请在得到有效答案后不要删除您的问题,以改进它。
-Widiomatic括号
标志仅影响
init
方法中对
self
的赋值的警告,以及使用
nextObject
选择器的返回值的赋值。请参阅中的
Sema::DiagnosticsAssignmentAsCondition
函数。如果您正确,正确的标志将是wParenthes,我将更新我的答案以反映这一点。谢谢直到我看到你的答案,我才知道惯用括号标志,所以谢谢你教我一些新东西。:)有趣的是,他们有一个类似于
-nextObject
的例子,它似乎非常特定于API。我猜苹果在内部经常使用这个成语…;^)@robmayoff在使用Xcode版本4.5(4G182)时,我感到困惑,因为我以前从来没有因为分配而遇到过这些错误,但最近,它没有捕捉到这些错误。我尝试在“其他链接器标志”和“警告链接器标志”中添加
-Widiomatic括号
,但均无效。这些不是链接器标志。尝试将
-wparenteses
添加到生成设置的“Apple LLVM编译器4.2-警告-所有语言”部分下的“其他警告标志”设置中。另外,请确保“C/C++/Objective-C编译器”设置(在“构建选项”部分下)设置为“Apple LLVM编译器4.2”,而不是“LLVM GCC 4.2”。您可以使用“构建设置”选项卡下的搜索框更轻松地查找这些设置。@robmayoff进行了这些更改,但仍然没有生成警告。“Apple LLVM编译器4.1”是Xcode 4.5的唯一选项。我将尝试更新到最新的Xcode,但是你还有其他想法吗?我想知道他是否在不知不觉中设置了标志-Wno括号,它覆盖了-wparenthes。如果您可以粘贴compile命令,这将有所帮助。进入日志导航器,单击“Compile[file].m”,然后单击最右边的“disclosure”按钮,将参数提供给编译器。粘贴在粘贴或要点上。