2015-09-22 14 views
2

我碰到過this有趣的文章,關於一個晦澀的(至少對我來說)Clang GCC擴展。Clang GCC擴展 - 括在圓括號中的塊返回一個值

他們說,用括號括起來的塊返回一個值,像...

UIButton *button = ({ 
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [button addTarget:self action:@selector(someSelector:) 
    forControlEvents:UIControlEventTouchUpInside]; 
    button; 
}); 

這是很難找到這個文件(有在網上和在鏘的網站非常少)。

有誰知道它是否安全使用?如果不是,爲什麼?

此外,它是否會導致保留循環像Objective-C塊?

回答

1

在gcc的文檔中,這被稱爲compound statement。很長時間以來(我第一次見到它在午夜指揮官用於二十世紀九十年代中期)一直是gcc 擴展(非標準C)。如果你關心的只是gcc和clang,那麼它就是「安全的」,因爲它可能不會從編譯器中移除。另一方面(請參閱文檔),注意到該特性在C++程序中可能不是一件好事。

下面是一些相關鏈接:

+0

聽起來很 「冒險」。你認爲在Objective-C中(使用Clang編譯器)使用它會成爲麻煩的祕訣嗎? –

+0

我期望臨時對象的文檔中的註釋也適用於Objective-C,但這是一個猜測。 Clang(除非開發人員重新設計這個設計)與gcc有相同的限制。 –