問題描述:之前對typedef的認識還是限於易於移植的層面,經常用到typedef unsigned int u32;之類的型別別名。對於typedef的更多高階的用法了解很少,於是查詢資料進行了學習。typedef和define的用法有些相同,但是差別也是很大的。兩者的相同大概就是具有乙個簡化替換的作用,但define是純粹的字元替換,而typedef是為定義的複雜型別起了簡單的別名。define是巨集,#define u32 unsigned int, 而typedef是型別定義,別名一般不像define一樣在前面,而且要用「;」結束。
高階用法:
1. 如指標、陣列一類的新型別定義:
typedef char line[81];//這裡為具有81個字元元素的陣列型別起了個別名叫line
line text,secondline;//定義text和secondline兩個具有81個字元元素的陣列,即char text[81];
//char secondline[81];
typedef char *pstr;//這裡為指向字元變數的指標型別起了個別名叫pstr
pstr p1;//定義了p1指標,即char *p1;
2. 有const的特殊情況:
typedef char *pstr;
const pstr p1;//這樣使用是有問題的,typedef後不是簡單的替換,不會成為const char *p1;而是會將p1指定
//為const限定
3. 結構中包含指向其自身的指標時:
typedef struct tagnode
*pnode;//這樣是錯誤的,型別本身尚未建立完成而使用pnode,編譯器此時是不認識pnode的
以下是三種可行的方式:
typedef struct tagnode
*pnode;
typedef struct tagnode *pnode;
struct tagnode ;
struct tagnode ;
typedef struct tagnode *pnode;//這種是規範做法
4. 對複雜變數建立型別別名的方式:
只要在傳統的變數宣告表示式裡用型別名替代變數名,然後把關鍵字typedef加在該語句的開頭就行了。
例1:int *(*a[5])(int, char*);//這是乙個函式指標陣列,函式的輸入引數為int和char*型別,返回值為int型的指標
typedef int *(*pfun)(int, char*);//pfun是建的乙個型別別名
pfun a[5];//使用定義的新型別來宣告物件,等價於int* (*a[5])(int, char*);
例2:void (*b[10]) (void (*)());
typedef void (*pfunparam)();//首先為上面表示式(void (*)())部分宣告乙個新型別
typedef void (*pfun)(pfunparam);//整體宣告乙個新型別
pfun b[10];//使用定義的新型別來宣告物件,等價於void (*b[10]) (void (*)());
例3:double(*(*pa)[9])();
typedef double(*pfun)();//首先為整體宣告乙個新型別
typedef pfun (*pfunparam)[9];//再為上面((*pa)[9])部分宣告乙個新型別
pfunparam pa;//使用定義的新型別來宣告物件,等價於double(*(*pa)[9])();
container of 的的的原理
另外一篇,同樣精彩,揭開linux核心中container of的神秘面紗 華清遠見嵌入式學院講師。在linux 核心中有乙個大名鼎鼎的巨集container of 這個巨集是用來幹嘛的呢?我們先來看看它在核心中是怎樣定義的。呵呵,乍一看不知道是什麼東東。我們先來分析一下container of p...
存在的就是合理的,發生的即是必然的。
筆者有時候會想,什麼是對,什麼是錯?對於追求某一件事情之前首先會考慮,為什麼我要做這件事情。所以經過自我分析和生活周邊環境的總結。我認為,對於乙個人來,這是在站在個體的角度上說。什麼是對的?就是你自己覺得是對的,它就是對的。不過這個只是你自己的想法。主觀上的正確,不代表客觀上也受到了別人的認可。就拿...
Apache的rewrite的重寫相關的引數
apache mod rewrite規則重寫的標誌一覽 使用mod rewrite時常用的伺服器變數 rewriterule規則表示式的說明 匹配任何單字元 chars 匹配字串 chars chars 不匹配字串 chars text1 text2 可選擇的字串 text1或text2 匹配0到1...