1.typedef的用途
1)定义一种类型的别名
注意typedef并不是简单的宏替换,如下例所示:

int main()
{
char *pa,pb;//声明了一个指向字符变量的指针pa,和一个字符变量pb
pa = "hello";
pb = "hello";//报错,不能将const char*类型的值赋给char类型的实体
pb = 'h';//正常
return ;
}

再看以下示例:

int main()
{
typedef char* PCHAR;
PCHAR pa,pb;
pa = "hello";
pb = "hello";//正常
pb = 'h';//报错,不能将char类型的值赋给PCHAR类型实体
return ;
}

可以看出,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 ;
}
int fun0(char a,char b)
{
cout<<"fun0"<<endl;
return ;
}
int fun1(char a,char b)
{
cout<<"fun1"<<endl;
return ;
}

输出结果:
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详解的更多相关文章

  1. (六)C语言之typedef详解

    1.typedef可以看作type define的缩写,顾名思义就是类型定义,也就是说它只是给已有的类型重新定义了一个方便使用的别名,并没有产生新的数据类型.typedef的使用与宏定义define有 ...

  2. c/c++中typedef详解

    1. typedef 最简单使用 typedef long byte_4; // 给已知数据类型long起个新名字,叫byte_4 你可以在任何需要 long 的上下文中使用 byte_4.注意 ty ...

  3. typedef 详解

    一行很常用的代码: typedef int XX_Size_Check[(sizeof(XX)==64)? 1:-1]; 很容易猜到上面这行代码是要在编译时检查XX的size,但再深究点,我们就会发现 ...

  4. C语言typedef详解

    原文链接 C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称.数组类型名称.指针类型名称与用户自定义的结构型名称.共用型名称.枚举型名称等.一旦用户在 ...

  5. C语言--enum,typedef enum 枚举类型详解

    原文:http://z515256164.blog.163.com/blog/static/32443029201192182854300/ 有改动 C语言详解 - 枚举类型 注:以下全部代码的执行环 ...

  6. sk_buff封装和解封装网络数据包的过程详解

    转自:http://www.2cto.com/os/201502/376226.html 可以说sk_buff结构体是Linux网络协议栈的核心中的核心,几乎所有的操作都是围绕sk_buff这个结构体 ...

  7. iOS开发——高级特性&Runtime运行时特性详解

    Runtime运行时特性详解 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机.主要内容如下: 引言 ...

  8. Linux C 字符串函数 sprintf()、snprintf() 详解

    一.sprintf() 函数详解 在将各种类 型的数据构造成字符串时,sprintf 的强大功能很少会让你失望. 由于 sprintf 跟 printf 在用法上几乎一样,只是打印的目的地不同而已,前 ...

  9. trie字典树详解及应用

    原文链接    http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用   一.知识简介        ...

随机推荐

  1. R——启程——豆瓣影评分析

    专业统计的我,自然免不了学R的,今天仔细看了这篇教程(感谢学姐的推荐@喜欢算法的女青年),就学着用R仿照着做一个,作为R语言学习的起点吧. 影评数据是用python爬的,之后会在python爬虫系列补 ...

  2. poll函数和串口设置

    2015.1.24 今天星期六,多云,早晨8:17起床的,今天是来南京起床最迟的一天,因为昨晚睡得有点迟,今天又不用上课,整个人有点放松.收拾好来到教室,教室门没有开,胡明也到了,其他人还在宿舍睡觉, ...

  3. Connection to DB

    Connect to MySQL PHP5 and later can work with a MySQL database using MySQLi extension PDO PDO will w ...

  4. React Native 弹性布局FlexBox

    React Native采用一中全新的布局方式:FlexBox(弹性布局).可以很方便的实现各种复杂布局,是全新的针对web和移动开发布局的一种实现方式. 何为FlexBox? 完整名称为:the f ...

  5. 建置 POSTFIX 服务器

    建置 POSTFIX 服务器 postfix 是除了 sendmail 以外 ,最被广泛采用的 Linux 邮件服务器,一般使用的观感不外乎两点: 一.安全:垃圾信过滤机制较聪明,就算什么都没设定,也 ...

  6. show master status empty解决方案

    The following MySQL error might occur if you are using MySQL replication and binary logs. mysql> ...

  7. WPF Step By Step 控件介绍

    WPF Step By Step 控件介绍 回顾 上一篇,我们主要讨论了WPF的几个重点的基本知识的介绍,本篇,我们将会简单的介绍几个基本控件的简单用法,本文会举几个项目中的具体的例子,结合这些 例子 ...

  8. Smart210学习-----lcd驱动

    帧缓冲设备 1.1帧缓冲设备:帧缓冲(framebuffer)是 Linux 系统为显示设备提供的一个接口,它将显示缓冲区抽象,屏蔽图像硬件的底层差异,允许上层应用程序在图形模式下直接对显示缓冲区进行 ...

  9. tracking 问题解决

    1.dir,或者C++函数读文件名,不推荐.搞乱了名字 2. matio读写矩阵

  10. PHP header() 函数详细说明(301、404等错误设置)

    原文来自:http://www.veryhuo.com/a/view/41466.html 如果您刚刚开始学习PHP,可能有许多函数需要研究,今天我们就来学习一下PHP Header()的使用方法,更 ...