GCC的Statements and Declarations in Expressions用法

導(dǎo)言

因?yàn)轫?xiàng)目比較老的緣故,(Google)protobuf的OC版本一直用的是一個(gè)古老的實(shí)現(xiàn),也就是使用Builder模式的實(shí)現(xiàn)。
例如:
對(duì)于這樣的一個(gè)proto定義:

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

創(chuàng)建最頂層結(jié)構(gòu)的代碼要這樣寫(xiě)

- (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要從最深層次對(duì)象開(kāi)始創(chuàng)建,逐層向上,思維方式十分的別扭。

于是,想起了GCC的一個(gè)擴(kuò)展語(yǔ)法,貌似挺好用。

- (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);
}

思維方式依次從上往下,十分舒暢。

用法講解

這個(gè)語(yǔ)法的形式是:({}),它是GNU C的一個(gè)擴(kuò)展語(yǔ)法(GCC和clang都支持它)。它的執(zhí)行結(jié)果是最后一個(gè)語(yǔ)句的值。如果最后一個(gè)語(yǔ)句不能被計(jì)算出值,那么這個(gè)結(jié)果是void類(lèi)型。

具體的語(yǔ)法講解請(qǐng)參考[Statement Expressions - GCC, the GNU Compiler Collection】(https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html)

疑問(wèn)

這個(gè)語(yǔ)法結(jié)構(gòu)內(nèi)的變量的生命周期是否和大括號(hào)({})的等同呢?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文: GCC-Inline-Assembly-HOWTO 1. 簡(jiǎn)介(Introduction.) 1.1 Co...
    桂糊涂閱讀 4,667評(píng)論 1 5
  • (一) gcc的基本用法 (二) 警告提示功能選項(xiàng) (三) 庫(kù)操作選項(xiàng) (四) 調(diào)試選項(xiàng) (五) 交叉編譯選項(xiàng) (...
    何景根閱讀 2,863評(píng)論 0 1
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,716評(píng)論 0 5
  • TITLE: 編程語(yǔ)言亂燉 碼農(nóng)最大的煩惱——編程語(yǔ)言太多。不是我不學(xué)習(xí),這世界變化快! 有時(shí)候還是蠻懷念十幾、二...
    碼園老農(nóng)閱讀 5,594評(píng)論 2 35
  • / 快過(guò)一場(chǎng)秋風(fēng),快過(guò)一列火車(chē) 快過(guò)玉米棒子的追趕 不能阻隔于河流、和魚(yú)的汛期 不能耽誤于山坡,和一場(chǎng)紅楓的事故 ...
    草根文學(xué)閱讀 1,943評(píng)論 1 3

友情鏈接更多精彩內(nèi)容