詳解 用typedef定義類型

【 轉載自  http://www.w3china.org/blog/more.asp?name=oceanblue&id=13138】 

用typedef定義類型

關鍵詞: typedef                                          

 

一、概念

 

C/C++語言中的typedef相信大家已經不陌生,本文對C/C++語言關鍵字typedef的各種用法作一個介紹。

 

typedef,顧名思義,爲“類型定義”,可以解釋爲:將一種數據類型定義爲某一個標識符,在程序中使用該標識符來實現相應數據類型變量的定義。

關鍵字typedef用於定義一種新的數據類型,它代表已有數據類型,是已有數據類型的別名。

功能:用自定義名字爲已有數據類型命名。

類型定義簡單形式:  typedef        type    name;

定義新數據類型INTEGER,它代表已有數據類型int。

定義新數據類型REAL,它代表已有數據類型float。

二、typedef定義類型步驟

1.按定義變量方法先寫出定義體,如 int i;

2.將變量名換成新類型名,如 int INTEGER;

3.最前面加typedef 如 typedef int INTEGER;

4.用新類型名定義變量,如 INTEGER i,j;

三、典型用法:

1、 定義結構體類型

 

結構體是一種較爲常見的數據類型,在C/C++程序設計中使用的非常廣泛。下面的代碼就是結構體類型的一個應用:

 

#include

 

int main (int argc, char *argv[])

 

{

 

    struct {int x; int y;} point_a, point_b;

 

    point_a.x = 10; point_a.y = 10;

 

    point_b.x = 0; point_b.y = 0;

 

    ios::sync_with_stdio();

 

    cout << point_a.x + point_a.y << endl;

 

    cout << point_b.x + point_b.y << endl;

 

    return 0;

 

}

 

上面的代碼包含了兩個結構體變量:point_apoint_b,它們的數據類型相同,都是struct {int x; int y;}類型。這種說法可能有點彆扭,習慣上說point_apoint_b都是結構體類型,爲什麼偏偏要說是struct {int x; int y;}類型呢?因爲這種說法更加精確。比如在第一個例子中,對於“unsigned int a, b;”這條語句,我們可以說ab都是整數類型,但更精確地說,它們應該是unsigned int類型。

 

既然struct {int x; int y;}是一種自定義的複雜數據類型,那麼如果我們要定義多個struct {int x; int y;}類型的變量,應該如何編寫代碼呢?其實很簡單,就當struct {int x; int y;}是一個簡單數據類型就可以了:

 

struct {int x; int y;} var_1;   // 定義了變量var_1

 

struct {int x; int y;} array_1 [10];   // 定義了數組array_1

 

struct {struct{int x; int y;} part1; int part2;} cplx;

 

上面的第三行定義了一個cplx變量,它的數據類型是一個複雜的結構體類型,有兩個成員:part1part2part1struct {int x; int y;}類型的,part2int類型的。

 

從上面的例子可以看出,如果在程序中需要多處定義struct {int x; int y;}類型的變量,就必須多次輸入“struct {int x; int y;}”這一類型名稱,況且,如果在結構體中有某個成員是struct {int x; int y;}類型的,還會使得定義變得非常繁雜而且容易出錯。爲了輸入程序的方便,同時爲了增強程序的可讀性,我們可以把struct {int x; int y;}這一數據類型定義爲標識符“Point”,那麼上面的程序就會變得更容易理解:

 

typedef struct {int x; int y;} Point;

 

Point var_1; // 定義了變量var_1

 

Point array_1 [10]; // 定義了數組array_1

 

struct {Point part1; int part2;} cplx; // 定義了複雜類型變量cplx

 

需要說明的是,我們還可以使用下面的方法來定義結構體變量:

 

struct t_Point {

 

    int x; int y;};   // 注意,這裏最後一個分號不能省略

 

 

 

int main(int argc, char* argv[])

 

{

 

    struct t_Point a, b;

 

    // . . .

 

    return 0;

 

}

 

顯然,這種方法沒有typedef更加直觀(在C++中,main函數第一行的struct關鍵字可以省略,但在標準C中,省略該關鍵字會出現編譯錯誤)。

 

此外,對於定義鏈接隊列中的結點,我們可以這樣實現:

 

typedef struct t_node {

 

    int Value;

 

    struct t_node *next;

 

} Node;

 

當然也可以這樣定義:

 

typedef strcut t_node Node;

 

struct t_node {

 

    int Value;

 

    Node *next;

 

};

 

 

 

2、定義數組類型

 

與定義結構體類型相似,可以使用typedef來定義數組類型,例如:

 

typedef int MyIntArray [100];

 

那麼程序中的

 

MyIntArray ia;

 

就相當於

 

int ia[100];

 

3、 定義函數指針

 

看下面的代碼:

 

typedef void (*FUNCADDR)(int)

 

此處FUNCADDR是指向這樣一個函數的指針,該函數的返回值爲void類型,函數有一個int型的參數。再例如:

 

void print (int x)

 

{

 

    printf (“%d\n”, x);

 

}

 

int main (int argc, char *argv[])

 

{

 

    FUNCADDR pFunc;

 

    pFunc = print;    // 將指針指向print函數

 

    (*pFunc)(25);     // 調用函數print

 

    return 0;

 

}

 

函數指針一般用於回調函數、中斷處理過程的聲明,以及在面向對象程序設計中對事件處理過程的聲明。

 

4、 定義類類型

 

類是面向對象程序設計語言中引入的一種新的數據類型,既然是數據類型,就可以使用typedef對其進行定義:

 

typedef class {

 

    private:

 

       int a;

 

    public:

 

       int b;

 

} MyClass;

 

其實這和定義結構體類型非常相似,不過很少有人這麼使用。 
四、typedef 與 #define的區別

typedef int COUNT

#define COUNT int

typedef定義一種新的數據類型(COUNT),它是已有類型(int)的別名。在編譯時COUNT類型與int類型相同

;#define定義一個宏(COUNT),在預編譯時,把字符串COUNT替換字符串int.

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章