在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > linux內(nèi)核中的typeof

            linux內(nèi)核中的typeof

            作者: 時間:2016-11-22 來源:網(wǎng)絡(luò) 收藏
            內(nèi)核版本:2.6.14

            今天分析內(nèi)核時又看到了typeof,只知道它大概是返回變量的類型,后來上網(wǎng)查了下發(fā)現(xiàn)這個關(guān)鍵字在linux中用的非常多。如果你對sizeof很熟悉的話,那么大可進行類推,sizeof(exp)返回的是exp的數(shù)據(jù)類型大小,那么typeof(exp.)返回的就是exp的數(shù)據(jù)類型。下面是linux內(nèi)核中typeof的一些例子。

            本文引用地址:http://www.biyoush.com/article/201611/319991.htminclude/linux/kernel.h
            [plain]view plaincopy
            print?
            1. /*
            2. *min()/max()macrosthatalsodo
            3. *stricttype-checking..Seethe
            4. *"unnecessary"pointercomparison.
            5. */
            6. #definemin(x,y)({
            7. typeof(x)_x=(x);//_x的數(shù)據(jù)類型和x一樣
            8. typeof(y)_y=(y);
            9. (void)(&_x==&_y);
            10. _x<_y?_x:_y;})
            11. #definemax(x,y)({
            12. typeof(x)_x=(x);
            13. typeof(y)_y=(y);
            14. (void)(&_x==&_y);
            linux/include/asm-arm/uaccess.h
            [plain]view plaincopy
            print?
            1. #defineget_user(x,p)
            2. ({
            3. constregistertypeof(*(p))__user*__pasm("r0")=(p);//__p的數(shù)據(jù)類型和*(p)的指針數(shù)據(jù)類型是一樣的,__p=p
            4. registertypeof(*(p))__r2asm("r2");//__r2的數(shù)據(jù)類型和*(p)的數(shù)據(jù)類型是一樣的
            5. registerint__easm("r0");
            6. switch(sizeof(*(__p))){
            7. case1:
            8. __get_user_x(__r2,__p,__e,1,"lr");
            9. break;
            10. case2:
            11. __get_user_x(__r2,__p,__e,2,"r3","lr");
            12. break;
            13. case4:
            14. __get_user_x(__r2,__p,__e,4,"lr");
            15. break;
            16. case8:
            17. __get_user_x(__r2,__p,__e,8,"lr");
            18. break;
            19. default:__e=__get_user_bad();break;
            20. }
            21. x=__r2;
            22. __e;
            23. })
            下面寫一個小程序示例一下:
            [plain]view plaincopy
            print?
            1. #include
            2. typedefstruct
            3. {
            4. intx;
            5. chary;
            6. }astruct,*pastrcut;
            7. intmain()
            8. {
            9. intsizem,sizew;
            10. intx=3;
            11. typeof(&x)m=&x;
            12. sizem=sizeof(m);
            13. *m=5;
            14. typeof(((astruct*)5)->y)w;
            15. sizew=sizeof(w);
            16. w="a";
            17. return1;
            18. }

            首先看main函數(shù)里的m變量,這個變量的類型就是typeof(&x), 由于x是int型的(這里與x是否被賦值一點關(guān)系都沒有),所以&x應(yīng)該是int *類型,那么typeof(&x)返回的類型就是int*,所以m自然也就是個int*類型的。

            然后我們看w變量,其類型是 typeof(((astruct *)5)->y), 其中astruct是一個被定義的結(jié)構(gòu)類型,其中的y元素是char類型,那么((astruct *)5)->y是啥意思呢?在這里5并不是真正的變量,可以把它理解為一個替代使用的符號,當然這個符號最好是一個數(shù),其意思更可以理解為一個被賦值了的變量,這個數(shù)可以是0,3,也可以是8也可以隨便什么都可以。那么((astruct *)5)->y僅僅就是表示了y這個變量,所以typeof的結(jié)果就是y元素的類型,也就是char。



            關(guān)鍵詞: linux內(nèi)核typeo

            評論


            技術(shù)專區(qū)

            關(guān)閉