OStack程序员社区-中国程序员成长平台

标题: ios - Clang GCC 扩展 - 括号中的 block 返回一个值 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 11:03
标题: ios - Clang GCC 扩展 - 括号中的 block 返回一个值

我遇到了this关于一个不起眼的(至少对我而言)Clang GCC 扩展的有趣文章。

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

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

很难找到这方面的文档(网上和 Clang 网站上的文档很少)。

有人知道它是否可以安全使用吗?如果不是,为什么?

另外,它是否会导致像 Objective-C block 一样的保留循环?



Best Answer-推荐答案


在 gcc 的文档中,这是 compound statement 的特殊形式。 ,其非正式定义如下:

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.
Recall that a compound statement is a sequence of statements surrounded by braces; in this construct, parentheses go around the braces.

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

例如,与 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 年的 gcc 1.35 中提到过)。我第一次看到它用在 Midnight Commander在 1990 年代中期(使其不适合在 $dayjob 中使用)。如果您只关心 gcc 和 clang,那么它是“安全的”,因为它可能不会从编译器中删除。

另一方面(请参阅文档),注意到该功能可能不是在 C++ 程序中使用的好东西。

以下是一些相关链接:

关于ios - Clang GCC 扩展 - 括号中的 block 返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32722259/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4