2012/07/06

Xcode與Clang(LLVM)輔助開發的小東西(#pragma、#warning、#error)

注意,我的開發環境是Xcode 4.2並使用Clang(LLVM)編譯器3.0版。Apple應該不太可能再回到GCC了,所以就不管了。

首先,可利用#warning會產生警告訊息,但還是能通過編譯建置成功。譬如說底下的程式碼:

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
  
#warning need to do some cleanup
}

編譯後就會出現在Issue Navagator裡。


撰寫程式碼時,有時候會突然想到當下無法處理的東西、或是想做個記號留待之後再處理,此時就可以用#warning。

但若改成#error的話,就會是錯誤訊息,通不過編譯建置。

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
  
#error need to do some cleanup
}



程式越寫越多,要怎麼分類管理呢?此時可以利用#pragma mark。譬如說如下的程式碼:

#pragma mark - Something Stupid
-(void)stupidA
{
}

-(void)stupidB
{
}

#pragma mark Something Smart
-(void)smartA
{
}

-(void)smartB
{
}
@end

Xcode的編輯器解析之後,就能呈現出如下的結果。


其中,在mark的後面若是減號「-」的話,就會有一條分隔線。然後秀出後面的文字。可利用#pragma將方法分門別類,找起來就輕鬆多了。

不僅如此,我們還能用MARK:、TODO:、FIXME:、!!!:、???:作更進一步的劃分,譬如說:

#pragma mark - Something Stupid
// MARK: markmarkmark
// TODO: todotodotodo
-(void)stupidA
{
}

// FIXME: fixmefixmefixme
-(void)stupidB
{
}

#pragma mark Something Smart
// ???: ?????????
-(void)smartA
{
}

/// !!!: !!!!!!!!!
-(void)smartB
{
}

呈現效果如下:


比較常用的是TODO:跟FIXME:。在開發時難免忘東忘西,若能直接在程式碼裡寫下來,這樣不是很棒嗎?

編譯器很聰明地幫我們找出有宣告卻沒使用的變數,並且吐出警告訊息,一般來說這是我們想要的,但在極少數的情況下,我們可能希望編譯器不要這麼煩人,此時可利用#pragma unused:

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
   
    int x;
    #pragma unused (x)
}

這麼一來,編譯器就不會對x作出未用變數的警告了。

不僅如此,我們還能關閉其他編譯器的警告與錯誤訊息。譬如說:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wmultichar"

char b = 'df'; // no warning.

#pragma clang diagnostic pop

以上的寫法能夠暫時關閉multichar這個警告訊息。先用push把目前的設定儲存起來,然後暫時忽略某些警告與錯誤訊息,然後再以pop回復先前的設定。

能夠關閉的訊息很多,詳情請參考clang使用手冊

參考資料:

No comments:

Post a Comment