码迷,mamicode.com
首页 > 编程语言 > 详细

C++ typedef详解

时间:2016-06-16 19:52:15      阅读:195      评论:0      收藏:0      [点我收藏+]

标签:

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++会报错。

C++ typedef详解

标签:

原文地址:http://www.cnblogs.com/shijingjing07/p/5591896.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!