C++ typedef詳解


1.typedef的用途
1)定義一種類型的別名
注意typedef並不是簡單的宏替換,如下例所示:

int main()
{
    char *pa,pb;//聲明了一個指向字符變量的指針pa,和一個字符變量pb
    pa = "hello";
    pb = "hello";//報錯,不能將const char*類型的值賦給char類型的實體
    pb = 'h';//正常
    return 0;
}

再看以下示例:

int main()
{
    typedef char* PCHAR;
    PCHAR pa,pb;
    pa = "hello";
    pb = "hello";//正常
    pb = 'h';//報錯,不能將char類型的值賦給PCHAR類型實體
    return 0;
}

可以看出,typedef char* PCHAR;之后,PCHAR是char*類型的別名,
PCHAR pa,pb;將pa,pb都定義成char*類型。

2)定義struct結構體別名
我們知道,當聲明一個結構體對象時,必須要帶上struct,
格式為:struct 結構體名 對象名;
如下例所示:

struct tagPOINT1
{
    int x;
    int y;
};
struct tagPOINT1 p1;

當我們用typedef定義struct的別名后,可以直接用別名 對象名來聲明一個對象
如下例所示:

typedef struct tagPOINT1
{
    int x;
    int y;
}POINT;
POINT p1;

3)用typedef來定義與平台無關的類型。
比如,某一平台支持int類型,而不支持long類型。
則可以使用typedef定義一個支持類型的別名,程序中使用該別名聲明變量。
這樣,我們使用極小的修改,typedef int REAL;就可以實現類型的平台無關性

標准庫中廣泛使用了這個技巧。

4)為復雜的聲明定義一個簡單的別名
如:typedef int (*A) (char, char);
A是我們定義的別名,表示的是一個指向函數的指針,
該函數有兩個char類型的參數,返回一個int類型的值。
則A類型的對象可以指向任何符合上述規則的函數。
如下例所示:

#include<iostream>
using namespace std;
typedef int (*A)(char,char);
int fun0(char a,char b);
int fun1(char a,char b);
int main()
{
    A a;
    a = fun0;
    a('a','b');
    a = fun1;
    a('a','b');
    return 0;
}
int fun0(char a,char b)
{
    cout<<"fun0"<<endl;
    return 0;
}
int fun1(char a,char b)
{
    cout<<"fun1"<<endl;
    return 0;
}

輸出結果:
fun0
fun1

2.typedef和#define的區別
由前面的講解,我們知道typedef和#define有本質的區別。
typedef是一種類型別名,而#define只是宏定義。二者並不總是可以互換的。
如下例所示:

typedef char *pStr1;
#define pStr2 char *;
pStr1 s1, s2;
pStr2 s3, s4;

其中s1, s2, s3是char*類型,而s4是char類型。

3.typedef需要注意的事項。
我們看一下下面的示例:

typedef char* pStr;
const char* p1 = "hello";
const pStr p2 = "hello";
p1++;//正常
p2++;//報錯

p1和p2都是常量指針,意思是指針指向的內容不能修改,而指針是可以修改的。
那為什么p1++正常,而p2++報錯呢。
對於p1++,我們不用再解釋了,因為常量指針是可變的。
p2是我們定義的別名,而不是系統固有類型,編譯器在編譯時,會認為p2是常量,不可修改
所以p2++會報錯。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM