1、typedef使用示例
typedef int a[10]; typedef void (*p)(void)
typedef int fun();
定義了乙個函式型別fun,所有這個型別的函式都返回乙個int型別的值。
再如:int sum(int a, int b)
return (a + b);
int sub(int a, int b)
return (a - b);
typedef int calctype(int a, int b); //這樣calctype就成了返回值為int型,接受引數為兩個整數的函式。
int main()
int select = -1;
int result;
int a;
int b;
calctype calculate = ;
printf("please select calculation type\n");
scanf("%d\n", select);
printf("input two value\n");
scanf("%d %d\n", &a, &b);
if (select == 0 || select == 1)
result = calculate[select](a, b);
return (0);
2、使用解釋
1)示例
int a[20]<=>int a=new int[20] //意思是開闢int型的20個位址空間給a,a的型別是a。
typedef char sstring[max]<=>typedef char[max] sstring //這樣,sstring就可以定義一維字元型陣列了。
如:sstring s1<=>char s1[max]。
這樣,我們再理解剛才上面提到的問題:
typedef int a[10]<=>typedef int[10] a //也就是說a可以去定義一唯整形陣列了。
typedef void (*p)(void) <=>typedef void(*)(void) p //可以用p去定義指向返回值為空值,引數也為空值的函式了。
typedef int fun() <=> typedef int() fun //意思是fun可以去定義返回值為int型的函式了。
總之,相當於定義別名,其值為表示式中除去新別名後的表示式。
2)使用typedef為現有型別建立同義字,定義易於記憶的型別名
typedef原型別名 替換型別名;
typedef char * pstr;
int mystrcmp(pstr, pstr);
注意:標準函式 strcmp()有兩個『const char *'型別的引數。 『const pstr'被解釋為『char * const'(乙個指向 char的常量指標),而不是『const char *'(指向常量 char的指標)。
typedef const char * cpstr;
int mystrcmp(cpstr, cpstr); //現在是正確的
記住:不管什麼時候,只要為指標宣告 typedef,那麼都要在最終的 typedef名稱中加乙個const,以使得該指標本身是常量,而不是物件。
3)**簡化
上面討論的typedef行為有點像 #define巨集,用其實際型別替代同義字。不同點是 typedef在編譯時被解釋,因此讓編譯器來應付超越預處理器能力的文字替換。例如:
typedef int (*pf) (const char *, const char *);
這個宣告引入了 pf型別作為函式指標的同義字,該函式有兩個 const char *型別的引數以及乙個 int型別的返回值。
再如一下面的三個例子(將複雜的式子用typedef簡化):
對複雜變數建立乙個型別別名的方法很簡單,你只要在傳統的變數宣告表示式裡用型別名替代變數名,然後把關鍵字typedef加在該語句的開頭就行了。
(1)int *(*a[5])(int, char*);如下轉化表達:
typedef int *(*pfun)(int, char*); //pfun是我們建的乙個型別別名
pfun a[5]; //使用定義的新型別來宣告物件,等價於int* (*a[5])(int, char*);
(2)void (*b[10])(void (*)());
typedef void (*pfunparam)(); //首先為上面表示式斜體加粗部分宣告乙個新型別
typedef void (*pfun)(pfunparam); //整體宣告乙個新型別
pfun b[10]; //使用定義的新型別來宣告物件,等價於void (*b[10]) (void (*)());
(3)doube(*)() (*pa)[9]; //首先為上面表示式斜體加粗部分宣告乙個新型別
typedef double(*pfun)(); //整體宣告乙個新型別
typedef pfun (*pfunparam)[9]; //使用定義的新型別來宣告物件,等價於doube(*)() (*pa)[9];
pfunparam pa;
4)促進跨平台開發
typedef有另外乙個重要的用途,那就是定義機器無關的型別,例如,你可以定義乙個叫real的浮點型別,在目標機器上它可以自動獲得最高的精度:
typedef long double real;
在不支援 long double的機器上,該 typedef看起來會是下面這樣:
typedef double real;
並且,在連 double都不支援的機器上,該 typedef看起來會是這樣:
typedef float real;
在大多數情況下,甚至這個微小的變動完全都可以通過奇妙的條件編譯來自動實現。標準庫廣泛地使用 typedef來建立這樣的平台無關型別:
size_t,ptrdiff和 fpos_t就是其中的例子。此外,象 std::string和 std::ofstream這樣的 typedef還隱藏了長長的,難以理解的模板特化語法,例如:basic_string,allocator>和 basic_ofstream>。
5)typedef與#define的比較
(a)他們的不同:
我們以例子進行。
例一:
typedef char *pstr;
#define pstr char *;
通常講,typedef要比#define要好,特別是在有指標的場合:
typedef char *pstr1;
#define pstr2 char *;
pstr1 s1, s2;
pstr2 s3, s4;
在上述的變數定義中,s1、s2、s3都被定義為char *,而s4則定義成了char,不是我們所預期的指標變數,根本原因就在於#define只是簡單的字串替換而typedef則是為乙個型別起新名字。
#define用法的乙個例子:
#define f(x) x*x
main( )
int a=6,b=2,c;
c=f(a) / f(b);
printf("%d \\n",c);
以下程式的輸出結果是: 36,出錯。
在許多c語言程式設計規範中提到使用#define定義時,如果定義中包含表示式,必須使用括號:#define f(x) (x*x),這樣才有正確結果。當然,使用typedef就沒有這樣的問題。
例二:下面的**中編譯器會報乙個錯誤,你知道是哪個語句錯了嗎?
typedef char * pstr;
char string[4] = "abc";
const char *p1 = string;
const pstr p2 = string;
p1++;
p2++;
是p2++出錯了。上述**中const pstr p2並不等於const char * p2,不是簡單的替換。const pstr p2和const long x本質上沒有區別,都是對變數進行唯讀限制,只不過此處變數p2的資料型別是我們自己定義的而不是系統固有型別而已。因此,const pstr p2的含義是:限定資料型別為char *的變數p2為唯讀,因此p2++錯誤。
(b)#define與typedef引申談
1) #define巨集定義的特別長處:可使用 #ifdef ,#ifndef等來進行邏輯判斷,使用#undef來取消定義。
2) typedef的特別長處:它符合範圍規則,使用typedef定義的變數型別其作用範圍限制在所定義的函式或者檔案內(取決於此變數定義的位置),而巨集定義則沒有這種特性。
6)typedef與儲存關鍵字
typedef就像 auto,extern,mutable,static,和 register一樣,是乙個儲存類關鍵字。這並不是說 typedef會真正影響物件的儲存特性;它只是說在語句構成上,typedef宣告看起來象 static,extern等型別的變數宣告。
第二個陷阱:
typedef register int fast_counter; //錯誤
編譯通不過。問題出在你不能在宣告中有多個儲存類關鍵字。因為符號 typedef已經佔據了儲存類關鍵字的位置,在 typedef宣告中不能用 register(或任何其它儲存類關鍵字)。
4、static
static修飾變數和修飾函式的意義是不同的(作用域與生成期)。
修飾變數是把該變數的作用與限制在某一範圍內,這個範圍可以是模組範圍、函式範圍、類範圍、復合語句範圍,但其生存期從進入其有效範圍開始到程式執行結束。
static修飾函式時,是把這個函式的有效範圍限制在定義他的模組內。
typedef宣告有助於建立平台無關型別,甚至能隱藏複雜和難以理解的語法。
typedef宣告,簡稱 typedef,為現有型別建立乙個新的名字。比如人們常常使用 typedef來編寫更美觀和可讀的**。所謂美觀,意指 typedef能隱藏笨拙的語法構造以及平台相關的資料型別,從而增強可移植性和以及未來的可維護性。
typedef用法總結
typedef,為現有資料型別建立乙個新的名字。typedef使用最多的就是建立易於記憶的型別名。型別出現在所宣告的變數名字中。例如typedef int size 此處宣告定義了乙個int的同義字,名字為size。主義typedef並不是建立新的型別。它僅僅是為現有型別新增乙個同義字,你可以在任何...
Typedef 用法總結
不管實在c還是c 中,typedef這個詞都不少見,當然出現頻率較高的還是在c 中。typedef與 define有些相似,但更多的是不同,特別是在一些複雜的用法上,就完全不同了,看了網上一些c c 的學習者的部落格,其中有一篇關於typedef的總結還是很不錯,由於總結的很好,我就不加修改的引用過...
typedef用法總結
define 是簡單的字串替換,相比 define,typedef可以用來定義乙個新型別,在c程式中比較常見。下面總結一下typedef的常用方法。1 定義一種型別,方便多多平台使用。如平台一 typedef long double real 平台一 typedef double real 平台一 ...