Ios Clang GCC扩展-括号中的块返回一个值

Ios Clang GCC扩展-括号中的块返回一个值,ios,gcc,clang,Ios,Gcc,Clang,我看到一篇有趣的文章,是关于一个晦涩难懂(至少对我来说)的铿锵GCC扩展的 他们说用括号括起来的块返回一个值,比如 UIButton *button = ({ UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; [button addTarget:self action:@selector(someSelector:) forControlEvents:UIControlEventTouchUpI

我看到一篇有趣的文章,是关于一个晦涩难懂(至少对我来说)的铿锵GCC扩展的

他们说用括号括起来的块返回一个值,比如

UIButton *button = ({   
  UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
  [button addTarget:self action:@selector(someSelector:) 
   forControlEvents:UIControlEventTouchUpInside];
   button;
});
很难找到这方面的文档(网上和网站上几乎没有)

有人知道使用它是否安全吗?若否,原因为何


此外,它是否会导致像Objective-C块这样的保留循环?

在gcc的文件中,这是一种特殊形式的,非正式定义如下:

括号中的复合语句可能在GNU C中显示为表达式。这允许您在表达式中使用循环、开关和局部变量。
回想一下,复合语句是由大括号包围的语句序列;在此构造中,括号围绕大括号

在本节后面的部分中,这称为语句表达式,但在定义该表达式的部分中,不使用该术语

例如,与gcc 2.7.2.3中的描述相比:

Statements and Declarations in Expressions                                      
==========================================                                      
                                                                                
   A compound statement enclosed in parentheses may appear as an                
expression in GNU C.  This allows you to use loops, switches, and local         
variables within an expression.
(这里没有“语句表达式”这一术语,当前的gcc源代码基本相同,对该特性的评论比较零散,但没有正式的定义)

很长一段时间以来,它一直是一个gcc扩展(不是标准C)(从1989年开始在中提到)。我第一次看到它是在20世纪90年代中期使用的(这使得它不适合在
$dayjob
中使用)。如果您只关心gcc和clang,那么它是“安全的”,因为它可能不会从编译器中删除

另一方面(参见文档),注意到该特性在C++程序中可能不是一个好的东西。 以下是一些相关链接:


听起来“有风险”。你认为在Objective-C中使用它(与Clang编译器一起使用)会带来麻烦吗?我希望文档中关于临时对象的注释也适用于Objective-C,但这只是猜测。Clang(除非开发人员重新考虑设计)的局限性与gcc几乎相同。