Ios Clang GCC扩展-括号中的块返回一个值
我看到一篇有趣的文章,是关于一个晦涩难懂(至少对我来说)的铿锵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
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++程序中可能不是一个好的东西。 以下是一些相关链接: