GCC的Statements and Declarations in Expressions用法

导言

因为项目比较老的缘故,(Google)protobuf的OC版本一直用的是一个古老的实现,也就是使用Builder模式的实现。
例如:
对于这样的一个proto定义:

message MessageA{
    required string msg = 1;
}
message MessageB {
    required MessageA amsg = 1;
}

创建最顶层结构的代码要这样写

- (void)makePB {
    MessageB_Builder *msgbBuilder = [MessageB builder];
    
    MessageA_Builder *msgaBuilder = [MessageA builder];
    msgaBuilder.msg = @"the message";    
    msgbBuilder.amsg = [msgaBuilder build];
    
    MessageB *msgb = [msgbBuilder build];
    NSLog(@"%@", msgb.amsg.msg);
}

其builder要从最深层次对象开始创建,逐层向上,思维方式十分的别扭。

于是,想起了GCC的一个扩展语法,貌似挺好用。

- (void)makePBWithGCC {
    MessageB_Builder *msgbBuilder = [MessageB builder];
    msgbBuilder.amsg = ({
        MessageA_Builder *msgaBuilder = [MessageA builder];
        msgaBuilder.msg = @"the message";
        [msgaBuilder build];
    });
    
    MessageB *msgb = [msgbBuilder build];
    NSLog(@"%@", msgb.amsg.msg);
}

思维方式依次从上往下,十分舒畅。

用法讲解

这个语法的形式是:({}),它是GNU C的一个扩展语法(GCC和clang都支持它)。它的执行结果是最后一个语句的值。如果最后一个语句不能被计算出值,那么这个结果是void类型。

具体的语法讲解请参考[Statement Expressions - GCC, the GNU Compiler Collection】(https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html)

疑问

这个语法结构内的变量的生命周期是否和大括号({})的等同呢?

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文: GCC-Inline-Assembly-HOWTO 1. 简介(Introduction.) 1.1 Co...
    桂糊涂阅读 4,567评论 1 5
  • (一) gcc的基本用法 (二) 警告提示功能选项 (三) 库操作选项 (四) 调试选项 (五) 交叉编译选项 (...
    何景根阅读 2,646评论 0 1
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,483评论 0 5
  • TITLE: 编程语言乱炖 码农最大的烦恼——编程语言太多。不是我不学习,这世界变化快! 有时候还是蛮怀念十几、二...
    码园老农阅读 5,382评论 2 35
  • / 快过一场秋风,快过一列火车 快过玉米棒子的追赶 不能阻隔于河流、和鱼的汛期 不能耽误于山坡,和一场红枫的事故 ...
    草根文学阅读 1,826评论 1 3