typedef的用法小总结

首先是typedef历史遗留问题,经常看到很多人写结构体就写:

typedef struct _A{int a;int b;}A;

A b;

我就一直很纳闷,为什么不直接写_A b呢?

昨天查资料才知道,原来这个是因为c语言遗留下来的,在C语言中,结构体对象声明必须加关键字struct,所以按C语言语法是:

struct  _A b;

大家都知道程序员很讲究效率,编代码也是,能少些一个单词绝不多写,所以用typedef确实是可以少些一个单词。

 

其实typedef不光可以少些单词,更重要的是代码美观,和避免拙劣代码(这个后面会提到)。

typedef常用方法分为3点

 

1:typedef为已经存在的类型定义别名,以增强可读性和避免平台的底层差异。

typedef int size;

size len=strlen(str);

这样类型名在一定程度上起了提示作用。而且可以避免平台的底层实现问题。如某个嵌入式平台没有实现int类型,而是由一个integer或者double。这个是用只需将项目的typedef改一下就可以,整个项目几乎不用动(如果新的类型不引发逻辑错误的话)。

 

常见的还有定义指针的:如

typedef void* PVOID;//etc

 

2:定义数组对象

typedef int array[2][2];

array b;

这个时候b就代码int[2][2]了。具体解析在第3点之后讲

 

3:定义函数指针

typedef int(*pF)(const char*,const char*);

这就定义了pF为一个函数指针。其返回值为int,参数是两个const char*。

 

由于pF是函数指针,所以可以声明这么一个函数,函数名是Register,函数的参数是一个pF类型的函数指针,返回值也是一个pF类型的函数指针。

pF Register(pF p);

但是如果没有typedef那会怎么样呢?

 

int(*Register (int(*pF)(const char*,const char*)))(const char*,const char*);

试问人世间愿意看到这样的代码的正常人还有多少?

我来分析一下为什么是这么写的,首先Register的参数列表是( int(*pF)(const char*,const char*) ),最外层括号里面是一个函数指针参数。

然后看函数名左边是*号,说明函数返回一个指针,然后用指针的眼光看待,把函数指针从结构中抽离出来就是int(*)(const char*,const char*)了。

 

其中2,3方法中牵扯到一个typedef的识别规则,就是“右左法则”。先往又看到一个括号或结尾,然后往往左看一个括号或结尾,重复此过程直到分析结束。

 

用这个方法分析2,3.先分析2:

先往右看是[2][2]说明array是一个数组,往左看知道他是int类型。这样就知道array代表整型2维数组。

再分析3:

先往又看是括号没说明什么,然后往左看是*,说明pF是指针。然后再忘又看是参数列表,说明是函数指针,再往左看是int就知道他是返回值了。

 

同时typedef的一些常出的错误:

1:

typedef char* PSTR;

const PSTR a;

此时const PSTR不代表const char*;而是代表char const*;

因为要从本质的理解const用法,const是给某个属性附加上常量属性。所以const PSTR是对字符指针加上不可变的常量属性。

就指针而言不可变是指的其指向不可变。

如果不明白的好:好好看看 const char*和char const*的区别。

 

2:

typedef在语法上是以存储关键字,所以typedef不能与auto,static,register,extern,mutable连用

如果连用:

typedef static int SINT;

编译器就是报告错误:有一个以上的存储关键字!

 

还有一些typedef经常与#define进行比较。

typedef比#define更结构化。

#define就是宏替换。而typedef是在语法级别上的代替。

所以一下代码比较:

 

typedef char* PSTR;

PSTR a,b;

 

相当于char* a;char *b;

而#define不然;请看

 

#define PSTR char *

PSTR a,b;

 

相当于char* a,b;

初学者可不要以为char *a,b;和char *a,char *b;是一回事。

C++基础知识里面有char* a,b;并没有把char* 类型给b,而是只给了char类型。所以char* a,b;中b是char类型而不是char*。

 

打完收工!

 

 

分享自己的心得,是帮助了别人,升华了自己!

 

时间: 2024-11-02 12:31:27

typedef的用法小总结的相关文章

基于typedef的用法详解_C 语言

也许新手用这个关键字不多,但它却是一个很有用的关键字,可以使代码模块化程度更好(即与其它代码的关联较少),在C++中还是实现Traits技术的基础,也是模板编程的基本语法之一. 若说变量定义是为变量命名,而typedef(或称为类型定义)就是为类型命名.既然都是命名,那就会有很多类似的地方.而变量定义我想大家都会使用,因此类型定义也必然会使用. 类型定义的语法可以归结为一句话:只要在变量定义前面加上typedef,就成了类型定义.这儿的原本应该是变量的东西,就成为了类型.如,下面的变量定义:in

结构体定义 typedef struct 用法详解和用法小结

typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请node 的变量时,需要这样写,struct node n;若用typedef,可以这样写,typedef struct node{}NODE; .在申请变量时就可以这样写,NODE n;区别就在于使用时,是否可以省去struct这个关键字.   第三篇:struct和typedef struct 分三块来讲述:1 首先:在C中定义一个结

C/C++语法知识:typedef struct 用法详解

第一篇:typedef struct与struct的区别 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等). 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明. 至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述. 2. typedef & 结构的问题 当用下面的代码定义一个结构时,编译器

javascript中replace()函数用法小谈

先看一下MSDN中的介绍 replace 方法 返回根据正则表达式进行文字替换后的字符串的复制. stringObj.replace(rgExp, replaceText) 参数 stringObj 必选项.要执行该替换的 String 对象或字符串文字.该字符串不会被 replace 方法修改. rgExp 必选项.为包含正则表达式模式或可用标志的正则表达式对象.也可以是 String 对象或文字.如果 rgExp 不是正则表达式对象,它将被转换 为字符串,并进行精确的查找:不要尝试将字符串转

讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别_javascript技巧

第一件事情. this 指钟是JavaScript语言中的一个特殊指钟,他在代码运行时,指向调用this语句的当前对象. 如果是事件绑定函数,则指向被绑定的元素本身. <script type="text/javascript"> //by Go_Rush(阿舜) from  http://ashun.cnblogs.com/ alert(this===window)  //true  直 接调用的时候,指向window本身 var gorush={     f:funct

深入C++ typedef的用法总结(必看)_java

第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量:以下则可行:typedef char* PCHAR; // 一般用大写PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针虽然:char *pa, *pb;也可行,但相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省

sql rollup用法 小计汇总_mssql2005

这里介绍sql server2005里面的一个使用实例: CREATE TABLE tb(province nvarchar(10),city nvarchar(10),score int)INSERT tb SELECT '陕西','西安',3UNION ALL SELECT '陕西','安康',4UNION ALL SELECT '陕西','汉中',2UNION ALL SELECT '广东','广州',5UNION ALL SELECT '广东','珠海',2UNION ALL SELEC

set()的用法小介

Set()函数 我们常用set( )函数来取得某些设置的默认值. 但是,Set()函数并不能取得所有的用set xxx to 设置的默认值. 比如,我们用 set default to c:\bzba 将默认目录设置为C:\bzba,但是当我们用set( )函数返回默认目录时,就会出错: ?set("default") 显示的默认目录将为C:\根目录. 在这种情况下应该使用其它的函数来取得默认值,比如在上面的例子中,我们应该使用sys(5)+sys(2003)来取得默认目录: ?sys

typedef和#define的用法以及区别_C 语言

一.typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef    int       INT;typedef    int       ARRAY[10];typedef   (int*)   pINT; typedef可以增强程序的可读性,以及标识符的灵活性,但它也有"非直观性"等缺点. 二.#define的用法 #define为一宏定义语句,通常用它来定义常量(包括无参