菜鸟教程小白 发表于 2022-12-13 11:03:42

ios - Clang GCC 扩展 - 括号中的 block 返回一个值


                                            <p><p>我遇到了<a href="http://cocoa-dom.tumblr.com/post/56517731293/new-thing-i-do-in-code" rel="noreferrer noopener nofollow">this</a>关于一个不起眼的(至少对我而言)Clang GCC 扩展的有趣文章。</p>

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

<pre><code>UIButton *button = ({   
UIButton *button = ;
[button addTarget:self action:@selector(someSelector:)
   forControlEvents:UIControlEventTouchUpInside];
   button;
});
</code></pre>

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

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

<p>另外,它是否会导致像 Objective-Cblock 一样的保留循环?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>在 gcc 的文档中,这是 <a href="https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html" rel="noreferrer noopener nofollow"><em>compound statement</em></a> 的特殊形式。 ,其非正式定义如下:</p>
<blockquote>
<p>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.
<br/>
Recall that a compound statement is a sequence of statements surrounded by braces; in this construct, parentheses go around the braces.</p>
</blockquote>
<p>在本节后面,这被称为<em>语句表达式</em>,但在定义它的部分中,没有使用该术语。</p>
<p>例如,与 gcc 2.7.2.3 中的描述进行比较:</p>
<pre><code>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.
</code></pre>
<p>(那里没有“语句表达式”一词——当前的 gcc 源代码大致相同,对该特性有零散的评论,但没有正式定义)。</p>
<p>长期以来,它一直是 gcc <em>扩展</em>(不是标准 C)(在 1989 年的 <a href="https://ftp.gnu.org/old-gnu/gcc/" rel="noreferrer noopener nofollow">gcc 1.35</a> 中提到过)。我第一次看到它用在 <a href="https://invisible-island.net/ncurses/ncurses-slang.html#vs-mc" rel="noreferrer noopener nofollow">Midnight Commander</a>在 1990 年代中期(使其不适合在 <code>$dayjob</code> 中使用)。如果您只关心 gcc 和 clang,那么它是“安全的”,因为它可能不会从编译器中删除。</p>
<p>另一方面(请参阅文档),注意到该功能可能不是在 C++ 程序中使用的好东西。</p>
<p>以下是一些相关链接:</p>
<ul>
<li> <a href="https://stackoverflow.com/questions/14147250/are-compound-statements-lvalue-or-rvalue-in-c" rel="noreferrer noopener nofollow">Are compound statements lvalue (or rvalue) in C?</a> </li>
<li> <a href="https://stackoverflow.com/questions/21825943/call-return-inside-gcc-compound-statement-expressions" rel="noreferrer noopener nofollow">call return inside GCC compound statement expressions</a> </li>
<li> <a href="https://stackoverflow.com/questions/20777555/gcc-optimising-away-compound-statement" rel="noreferrer noopener nofollow">gcc optimising away compound statement</a> </li>
</ul></p>
                                   
                                                <p style="font-size: 20px;">关于ios - Clang GCC 扩展 - 括号中的 block 返回一个值,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/32722259/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/32722259/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - Clang GCC 扩展 - 括号中的 block 返回一个值