2012-11-05 112 views
1

有沒有一種方法可以在分配變量而不是檢查相等時發出警告?有很多次我意外地分配了,而不是進行比較,如果有警告會很棒!if語句中的賦值警告?

有沒有一種方法可以Xcode的警告我,而無需改變編碼樣式:

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

不是默認已經這麼做嗎? –

+0

雅我默認它也 –

+0

@菲菲,謝謝!會做,沒有意識到這一點。 – nmock

回答

8

在大多數情況下,如果在if語句中使用=而不是==,則Xcode已經發出警告。如果您沒有收到警告,請告訴我們您正在使用的Xcode版本,您的項目有多大年紀,以及您的默認設置已更改爲哪些版本。

我的測試:我在Xcode 4.5.2中創建了一個全新的iOS應用程序,並沒有更改任何構建設置。我只是給application:didFinishLaunchingWithOptions:添加了一些代碼來觸發警告。那就是:

Using the result of an assignment as a condition without parentheses

您可以通過設置編譯器的-Wno-parentheses標誌禁用警告(但爲什麼要?)。您可以通過添加額外的括號的分配各地抑制在特定情況下的警告:

if ((x = 7)) { 

有兩種情況下,你沒有得到默認的警告。首先,在init方法,您可以分配到self,像這樣:

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

其次,在任何情況下,您可以指定nextObject選擇的結果,是這樣的:

while (object = [enumerator nextObject]) { // no warning by default 

你可以通過設置編譯器的-Widiomatic-parentheses標誌在這些情況下啓用警告。

+0

爲什麼downvote? –

+0

我問自己同樣的問題.....看起來對我來說好吧... +1 –

+0

@robmayoff使用Xcode版本4.5(4G182),我很困惑,因爲我之前從未遇到過這些錯誤,但最近它並沒有捕捉到它們。我曾嘗試在「其他鏈接器標誌」以及「警告鏈接器標誌」中添加'-Widiomatic-brackhees'無效。 – nmock

1

的編譯器標誌Wparentheses應該做的伎倆。它會迫使你在有條件的地方放置括號,以便編譯。鏗鏘有默認設置此標誌。

+1

'-Widiomatic-parentheses'標誌僅影響'init'方法中'self'賦值的警告,並且使用'nextObject'選擇器的返回值賦值。請參閱[SemaExpr.cpp]中的Sema :: DiagnoseAssignmentAsCondition功能(http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?revision=166496&view=markup)。 –

+0

你是對的,正確的標誌是Wparentheses,我會更新我的答案以反映這一點。謝謝 – yfrancis

+0

直到我看到你的答案,我才知道習慣括號,所以謝謝你教我新的東西。 :) –