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]