<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>

    Rss & SiteMap

    曙海教育集團論壇 http://www.bjzhda.cn

    曙海教育集團論壇
    共1 條記錄, 每頁顯示 10 條, 頁簽: [1]
    [瀏覽完整版]

    標題:C(不討論C++)語言

    1樓
    wangxinxin 發表于:2010-12-10 14:26:54

    C語言中的名字空間, 較少被提及. 下面的寫法乍看之下是會讓人吃驚的:

    #include <stdio.h>

    struct Foo
    {
        int table_id;
        signed int length:4;
    } ;

    typedef struct Foo Foo;
    int main()
    {
        Foo Foo;
        printf("size: %lld ", (long long) sizeof(Foo));
        // Foo t1 = {0};
        return 0;
    }

    Foo 首先是一個struct的tag名字, 其次又被typedef定義了一個同名的別名. 然后, 在main函數中,
    以Foo Foo; 定義了該類型的一個變量, 同樣名為Foo.

    這樣的程序竟然是符合標準的. 原因就在于C語言中有4個名字空間, 當標識符在不同的上下文情境下位于不同的名字空間時, 可同時出現而不會引起沖突.

    我查看了C語言標準, 6.2.3 Name Spaces and Identifiers
    其中定義的4個名字空間如下:
    1. label 單獨位于一個名字空間, 由于goto有害論, label受到牽連, 現今其重要性極低.
    2. struct, union  , enum的名字, 在C標準中用tag一詞指代, 它們的名字位于一個名字空間, 也就是說, 如果你已經
    struct Foo { ... };
    就不能再
    enum Foo {... };

    3. struct, 或union  的成員, 位于由相應的struct或union  聲明范圍內的一個密閉名字空間, 兩個不同的struct, 或struct與union  的成員, 可以有同樣的名字, 這一規則可以遞歸地施行于struct / union  的子成員. 如果它們本身也是一個struct或union  的話.

    4. 所有其它的一切東西, 比如函數名, 變量名等等.

    根據這4條, 上面的程序該如何解釋? Foo 重復出現了3次:
    struct Tag.
    typedef 或
    main內的變量名.

    根據上面的定義, 作為typedef定義出來的類型名和main內的變量名同屬于"其它"類, 應該會出現沖突. 但實際上這樣的用法是允許的. 因為在main內通過
    Foo Foo;
    定義變量Foo時, 第一個Foo的語意只能是typedef定義出來的Foo才合理, 此時作為變量的Foo還沒定義完成, 所以沒有沖突.

    那一行注釋起來的
    // Foo t1...
    如果去掉注釋, 就會引起編譯錯誤,

    test.c:15: error: expected ';' before 't1'
    gcc的這條錯誤并沒提供多少有用的信息.

    因為在此時的上下文中, 就有了兩個identifier位于同一個名字空間. 而printf中的sizeof(Foo) 究竟是作為typedef定義出來的別名Foo, 還是變量名Foo.

    雖然無法從程序運行結果上知道, 但可以確定應該是變量名Foo, 簡單的實驗加推理可以證實這一點:
    將Foo Foo改為char Foo;
    此時大小變為1.

    推理:
    typdef定義的別名其作為域在最外層, 而在main內, 變量Foo暫時性地遮蔽了外層Foo的意義.
    對上面程序作如下修改, 得到的結果可以證實:

    int main()
    {
        {
            char Foo;
            int a = 4, b = a;
            printf("size: %lld ", (long long)sizeof(Foo) );
        }
        printf("size: %lld ", (long long)sizeof(Foo) );
        struct Foo t1 = {0};
        return 0;
    }

    另一個需要注意的地方是, C語言中定義的結構的可見性, 是平坦的,
    struct Foo
    {
       struct Bar { ... };
    };

    熟悉C++類型系統的人可能會懷疑是否能直接使用結構Bar, 要不要Foo::, C里面Bar的可用性跟Foo是平級的.本篇文章

    共1 條記錄, 每頁顯示 10 條, 頁簽: [1]

    Copyright © 2000 - 2009 曙海教育集團
    Powered By 曙海教育集團 Version 2.2
    Processed in .01563 s, 2 queries.
    主站蜘蛛池模板: 18美女私密尿口视频| 亲密爱人免费观看完整版| 97视频精品全国在线观看| 成年人性生活片| 亚洲国产电影在线观看| 男人边吃奶边爱边做视频刺激| 国产成人免费ā片在线观看| a破外女出血毛片| 怡红院在线播放| 久草手机在线播放| 欧美免赞性视频| 免费一级肉体全黄毛片| 综合激情区视频一区视频二区| 国产极品美女高潮无套在线观看| japanesehd熟女熟妇| 成人au免费视频影院| 久草视频在线资源站| 欧美三级全部电影观看| 免费大片黄手机在线观看| 美女视频黄频大全免费| 国产无遮挡又黄又爽在线视频 | 67194成手机免费观看| a级情欲片在线观看hd| 99在线在线视频免费视频观看| freehd麻豆| aaa国产一级毛片| 91精品国产免费入口| 2021精品国产品免费观看| 麻豆映画传媒有限公司地址| 青青草原视频在线观看| 色哟哟在线网站| 女同学下面粉嫩又紧多水| 久久伊人精品一区二区三区| 极品国产高颜值露脸在线| 人人妻人人爽人人澡人人| 精品久久久中文字幕| 国产人妖乱国产精品人妖| 久久精品国产91久久综合麻豆自制| 久久久久无码中| 一个人看的片免费高清大全| 97色婷婷成人综合在线观看|