• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 11:03:42 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我遇到了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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap