久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > linux內核中的typeof

linux內核中的typeof

作者: 時間:2016-11-22 來源:網絡 收藏
內核版本:2.6.14

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

本文引用地址:http://cqxgywz.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的數據類型和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的數據類型和*(p)的指針數據類型是一樣的,__p=p
  4. registertypeof(*(p))__r2asm("r2");//__r2的數據類型和*(p)的數據類型是一樣的
  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函數里的m變量,這個變量的類型就是typeof(&x), 由于x是int型的(這里與x是否被賦值一點關系都沒有),所以&x應該是int *類型,那么typeof(&x)返回的類型就是int*,所以m自然也就是個int*類型的。

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



關鍵詞: linux內核typeo

評論


技術專區

關閉