<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          linux內(nèi)核中的typeof

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

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

          本文引用地址:http://www.ex-cimer.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. })
          下面寫一個(gè)小程序示例一下:
          [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變量,這個(gè)變量的類型就是typeof(&x), 由于x是int型的(這里與x是否被賦值一點(diǎn)關(guān)系都沒有),所以&x應(yīng)該是int *類型,那么typeof(&x)返回的類型就是int*,所以m自然也就是個(gè)int*類型的。

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



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

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();