C语言中typedef用法

合集下载

c语言 union和typedef

c语言 union和typedef

c语言union和typedef摘要:一、C语言中的联合体(union)1.联合体的概念2.联合体的特点3.联合体的使用场景4.联合体与结构体的区别二、C语言中的typedef1.typedef的概念2.typedef的作用3.使用typedef优化代码4.typedef与宏定义的区别正文:C语言是一种广泛应用于系统开发和嵌入式领域的编程语言。

在C语言中,联合体(union)和typedef是两个非常重要的关键字,它们可以帮助我们更好地管理和组织代码。

一、C语言中的联合体(union)1.联合体的概念联合体是一种特殊的结构体,它允许我们将多个不同类型的变量存储在同一个内存空间中。

在联合体中,变量的数量等于成员数量,且所有成员共享同一内存空间。

当一个联合体的某个成员被修改时,其他成员的值也会相应地发生改变。

2.联合体的特点(1)所有成员共用同一内存空间。

(2)联合体的长度等于最长的成员长度。

(3)只能通过一个联合体的成员访问其他成员。

3.联合体的使用场景联合体常用于以下场景:(1)节省内存空间。

(2)实现数据的一对多关系。

(3)简化代码结构。

4.联合体与结构体的区别联合体与结构体的主要区别在于内存分配和成员访问方式。

联合体的所有成员共享同一内存空间,而结构体的每个成员都有自己独立的内存空间。

此外,访问联合体的成员时,需要通过一个成员作为“中介”,而结构体的成员可以直接访问。

二、C语言中的typedef1.typedef的概念typedef是一个编译时指令,它允许我们为已有的数据类型创建一个新的名字。

通过typedef,我们可以提高代码的可读性和可维护性,同时避免与其他库或标准库中的类型冲突。

2.typedef的作用(1)简化类型声明。

(2)提高代码可读性。

(3)避免类型名冲突。

3.使用typedef优化代码以下是一个使用typedef优化代码的例子:```ctypedef struct {int x;int y;} Point;Point p1 = {1, 2};Point p2 = {3, 4};```通过使用typedef,我们可以更清晰地表示点的坐标,同时避免与其他类型冲突。

typedef_struct_用法详解和用法小结

typedef_struct_用法详解和用法小结

} S1; //这种方法可以在 c 或者 c++中定义一个 S1 结构 struct S2 { int data; int text; }; // 这种定义方式只能在 C++中使用,而如果用在 C 中,那么编译器会报错 struct { int data; int text; } S3; 这种方法并没有定义一个结构,而是定义了一个 s3 的结构变量,编译器会为 s3 内存。 void main() { S1 mine1;// OK ,S1 是一个类型 S2 mine2;// OK,S2 是一个类型 S3 mine3;// OK,S3 不是一个类型 S1.data = 5;// ERRORS1 是一个类型 S2.data = 5;// ERRORS2 是一个类型 S3.data = 5;// OKS3 是一个变量 } 另外,对与在结构中定义结构本身的变量也有几种写法 struct S6 {
第三篇: 第三篇:struct 和 typedefstruct 分三块来讲述: 1 首先: 在 C 中定义一个结构体类型要用 typedef: typedefstruct Student { int a; }Stu; 于是在声明变量的时候就可:Stu stu1; 如果没有 typedef 就必须用 struct Student stu1;来声明 这里的 Stu 实际上就是 struct Student 的别名。 另外这里也可以不写 Student(于是也不能 struct Student stu1;了) typedefstruct { int a; }Stu; 但在 c++里很简单,直接 struct Student { int a; };
[知识点] 结构也是一种数据类型, 可以使用结构变量, 因此, 象其它 类型的变量一样, 在使用结构变量时要先对其定义。 定义结构变量的一般格式为: struct 结构名 { 类型 变量名; 类型 变量名; ... } 结构变量; 结构名是结构的标识符不是变量名。 另一种常用格式为: typedefstruct 结构名 { 类型 变量名; 类型 变量名; ... } 结构别名; 另外注意: 在 C 中,struct 不能包含函数。在 C++中,对 struct 进行了扩展, 可以包含函数。 ===================================================================== = 实例 1: struct.cpp #include <iostream> using namespace std;

c中typedef的作用

c中typedef的作用

c中typedef的作用typedef是C语言中的一个关键字,用于给已有的数据类型起一个新的别名。

它的作用主要有以下几个方面。

1. 提高代码可读性和可维护性typedef可以为已有的数据类型起一个新的别名,使得代码更加易读和易懂。

通过为数据类型起一个具有描述性的名字,可以让代码的意图更加清晰,降低代码阅读和理解的难度。

例如,可以使用typedef为int起一个别名为Age,这样在代码中使用Age时,会更加直观地表示这是一个表示年龄的变量。

2. 提高代码的可移植性使用typedef可以将数据类型的名称与具体的实现解耦,从而提高代码的可移植性。

在不同的编译器和平台上,可能存在数据类型名称的差异,如果直接在代码中使用具体的数据类型名称,可能会导致代码在不同环境下无法编译或运行。

而使用typedef定义别名,则可以将数据类型名称统一起来,便于在不同环境下进行移植。

3. 简化复杂的数据类型有些数据类型在定义时比较复杂,例如结构体、联合体或函数指针等。

使用typedef可以将这些复杂的数据类型定义为一个简单的别名,从而简化代码的书写和理解。

例如,可以使用typedef为一个包含多个字段的结构体起一个别名,这样在代码中使用别名时,可以减少代码的冗长和复杂度。

4. 增加代码的灵活性和可扩展性使用typedef可以为数据类型定义一个别名,从而使得代码更具灵活性和可扩展性。

当需要修改或替换某个数据类型时,只需要修改typedef的定义,而无需修改代码中具体的数据类型名称。

这样可以减少代码的改动范围,提高代码的维护效率。

同时,typedef也可以为数据类型定义不同的别名,从而增加代码的灵活性和可扩展性。

这样,在不同的场景下,可以使用不同的别名来表示相同的数据类型,从而使代码更加通用和可复用。

typedef是C语言中非常有用的一个关键字,它可以为已有的数据类型起一个新的别名,提高代码的可读性、可移植性、灵活性和可扩展性。

C语言typedef用法总结

C语言typedef用法总结

C语言typedef用法总结黄海涛,2012-3-11C语言中的typedef可以让人感觉很清新,但也可以让人感觉神秘。

当你一层层剥开它的时候,神秘的面纱终会摘下……让我们一起来探究其中的秘密吧!一、概述1、类型定义符typedefC语言提供了一个称为typedef的工具,它允许你为各种数据类型定义新的名字。

定义形式:typedef 原类型名新类型名;它的格式与变量声明完全一样,只是把typedef这个关键字放在声明的前面,但typedef并不创建变量,而是为指定类型引入一个新的名字。

2、实质其实质是:为现有类型取个新名字,它并没有引入新的类型。

typedef是一种声明形式,它为一种类型引入新的名字,而不是产生新的类型,也不会为变量分配空间。

3、作用时机在某些方面,typedef类似于宏文本替换,但typedef是类型定义符,在编译时会有相应类型的检查。

typedef是由编译器解释的。

▲typedef与#define的区别A.#define后面没有分号,而typedef后面有分号;B.#define不是关键字,而typedef是关键字;C.宏定义中宏名紧跟着#define,而typedef中的类型名并不紧接其后;D.可以用其他类型说明符对宏名进行扩展,但对typedef定义的类型名却不行;例如:E.在连续几个变量声明中,typedef定义的类型名可以保证声明中所有的变量均为同一种类型,而#define定义的宏名则无法保证。

4、使用原因1)表达方式更简洁,简化编程;2)使程序参数化,提高程序的可移植性;3)为程序提供更好的说明性,可以引入一个易记且意义明确的新名字,提升可维护性。

5、缺点允许一些看上去混乱的语法,可以把几个声明放在一个声明中。

如:二、使用typedef声明定义时的限制1、2、3、存储类关键字:auto、extern、register、static与typedef但在存储类说明符中,typedef是个例外,它不会真正影响对象的存储特性。

C++typedef用法详解

C++typedef用法详解

C++typedef⽤法详解转⾃,经过整理typedef的语法描述在现实⽣活中,信息的概念可能是长度,数量和⾯积等。

在C语⾔中,信息被抽象为int、float和 double等基本数据类型。

从基本数据类型名称上,不能够看出其所代表的物理属性,并且int、float和double为系统关键字,不可以修改。

为了解决⽤户⾃定义数据类型名称的需求,C 语⾔中引⼊类型重定义语句typedef,可以为数据类型定义新的类型名称,从⽽丰富数据类型所包含的属性信息。

typedef的语法描述typedef 类型名称类型标识符;typedef为系统保留字,“类型名称”为已知数据类型名称,包括基本数据类型和⽤户⾃定义数据类型,“类型标识符”为新的类型名称。

例如: typedef double LENGTH;typedef unsigned int COUNT;定义新的类型名称之后,可像基本数据类型那样定义变量。

例如:typedef unsigned int COUNT;unsigned int b;COUNT c;typedef 的主要应⽤形式typedef 的主要应⽤有如下的⼏种形式:1) 为基本数据类型定义新的类型名。

2) 为⾃定义数据类型(结构体、公⽤体和枚举类型)定义简洁的类型名称。

3) 为数组定义简洁的类型名称。

4) 为指针定义简洁的名称。

为基本数据类型定义新的类型名typedef unsigned int COUNT;typedef double AREA;此种应⽤的主要⽬的,⾸先是丰富数据类型中包含的属性信息,其次是为了系统移植的需要,稍后详细描述。

为⾃定义数据类型(结构体、公⽤体和枚举类型)定义简洁的类型名称。

例如:struct Point{double x;double y;double z;};struct Point oPoint1={100,100,0};struct Point oPoint2;其中结构体struct Point为新的数据类型,在定义变量的时候均要有保留字struct,⽽不能像int和double那样直接使⽤Point来定义变量。

c语言 typedef 回调函数

c语言 typedef 回调函数

c语言 typedef 回调函数在C语言中,typedef可以用来为函数指针定义别名,这在回调函数中非常有用。

回调函数是指在某个特定事件发生时由另一个函数调用的函数。

通过使用typedef,我们可以为回调函数定义一个更加简洁的别名,使得代码更易读和易维护。

首先,我们需要定义回调函数的原型,然后使用typedef为这个函数指针定义一个别名。

例如:c.typedef int (CallbackFunction)(int, int);这里,我们定义了一个名为CallbackFunction的别名,它表示一个返回类型为int,接受两个int类型参数的函数指针。

接下来,我们可以在需要使用回调函数的地方使用这个别名,比如作为另一个函数的参数。

例如:c.void performOperation(int x, int y, CallbackFunction callback) {。

int result = callback(x, y);printf("Result: %d\n", result);}。

在上面的例子中,performOperation函数接受两个int类型参数和一个CallbackFunction类型的回调函数作为参数,然后在函数内部调用这个回调函数并打印结果。

当我们实际调用performOperation函数时,我们可以传递任何符合CallbackFunction原型的函数指针作为回调函数,无需重复写函数指针的完整声明,使得代码更加简洁和易读。

总之,通过使用typedef为回调函数定义别名,我们可以使代码更加清晰易懂,提高代码的可读性和可维护性。

这种技术在C语言中经常用于回调函数的处理,尤其是在涉及到事件驱动的编程中。

C语言typedef详解

C语言typedef详解

C语⾔typedef详解允许⽤户使⽤ typedef 关键字来定义⾃⼰习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与⽤户⾃定义的结构型名称、共⽤型名称、枚举型名称等。

⼀旦⽤户在程序中定义了⾃⼰的数据类型名称,就可以在该程序中⽤⾃⼰的数据类型名称来定义变量的类型、数组的类型、指针变量的类型与函数的类型等。

例如,C 语⾔在 C99 之前并未提供布尔类型,但我们可以使⽤ typedef 关键字来定义⼀个简单的布尔类型,如下⾯的代码所⽰:1. typedef int BOOL;2. #define TRUE 13. #define FALSE 0定义好之后,就可以像使⽤基本类型数据⼀样使⽤它了,如下⾯的代码所⽰:1. BOOL bflag=TRUE;typedef的4种⽤法在实际使⽤中,typedef 的应⽤主要有如下4种。

1) 为基本数据类型定义新的类型名也就是说,系统默认的所有基本类型都可以利⽤ typedef 关键字来重新定义类型名,⽰例代码如下所⽰:1. typedef unsigned int COUNT;⽽且,我们还可以使⽤这种⽅法来定义与平台⽆关的类型。

⽐如,要定义⼀个叫 REAL 的浮点类型,在⽬标平台⼀上,让它表⽰最⾼精度的类型,即:1. typedef long double REAL;在不⽀持 long double 的平台⼆上,改为:1. typedef double REAL;甚⾄还可以在连 double 都不⽀持的平台三上,改为:1. typedef float REAL;这样,当跨平台移植程序时,我们只需要修改⼀下 typedef 的定义即可,⽽不⽤对其他源代码做任何修改。

其实,标准库中⼴泛地使⽤了这个技巧,⽐如 size_t 在 V2010 的 crtdefs.h ⽂件中的定义如下所⽰:1. #ifndef _SIZE_T_DEFINED2. #ifdef _WIN643. typedef unsigned __int64 size_t;4. #else5. typedef _W64 unsigned int size_t;6. #endif7. #define _SIZE_T_DEFINED8. #endif2) 为⾃定义数据类型(结构体、共⽤体和枚举类型)定义简洁的类型名称以结构体为例,下⾯我们定义⼀个名为 Point 的结构体:1. struct Point2. {3. double x;4. double y;5. double z;6. };在调⽤这个结构体时,我们必须像下⾯的代码这样来调⽤这个结构体:1. struct Point oPoint1={100,100,0};2. struct Point oPoint2;在这⾥,结构体 struct Point 为新的数据类型,在定义变量的时候均要向上⾯的调⽤⽅法⼀样有保留字 struct,⽽不能像 int 和 double 那样直接使⽤ Point 来定义变量。

C语言中typedef用法

C语言中typedef用法
如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法?
使用 typedefs 为现有类型创建同义字。
定义易于记忆的类型名
typedef 使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于 &#39;&#39;typedef&#39;&#39; 关键字右边。例如:
C语言中typedef用法
1. 基本解释
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
typedef void (*pFunParam)();
//整体声明一个新类型
typedef void (*pFun)(pF
unParam);
//使用定义的新类型来声明对象,等价于void (*b[10]) (void (*)());
size len = file.getlength();
std::vector &lt;size&gt; vs;
typedef 还可以掩饰符合类型,如指针和数组。例如,你不用象下面这样重复定义有 81 个字符元素的数组:
char line[81];
char text[81];
定义一个 typedef,每当要用到相同类型和大小的数组时,可以这样:
根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。
解决这个问题的方法有多种:

c语言 union和typedef

c语言 union和typedef

c语言 union和typedefC语言中的union和typedef是两个非常重要的概念,它们可以在编写程序时提供更多的灵活性和可读性。

本文将详细介绍union和typedef的概念、用法和示例。

一、union的概念和用法union是一种特殊的数据类型,它允许在同一个内存空间中存储不同的数据类型。

在union中,所有成员共用同一块内存空间,每个成员所占的空间取决于最大的成员。

使用union的好处是可以节省内存空间,并且可以在不同的成员之间快速切换。

1.定义union类型可以通过以下方式定义一个union类型:```union UnionName {member_type1 member_name1;member_type2 member_name2;...};```其中,UnionName是union类型的名称,member_type1和member_type2是不同成员的数据类型,member_name1和member_name2是成员变量的名称。

一个union可以有多个成员,每个成员可以是不同的数据类型。

2.使用union变量定义union变量的方式与定义其他类型的变量类似:```union UnionName variable_name;```然后可以通过点操作符来访问union变量的成员:```variable_name.member_name;```可以根据需要在不同的成员之间进行赋值和访问,但是要注意在访问前确保当前成员已经正确赋值。

3.union的大小和对齐union的大小取决于最大的成员,因为所有成员共用同一块内存空间。

在分配内存空间时,系统会根据最大成员的大小进行对齐操作,以保证每个成员的地址对齐。

二、typedef的概念和用法typedef是一种用于定义类型别名的关键字,它可以为已有的数据类型定义一个新的名称。

使用typedef可以提高代码的可读性,并且可以简化对复杂数据类型的使用。

typedef class用法

typedef class用法

一、typedef关键字的作用typedef 是C语言中用来定义新数据类型的关键字,它可以给现有的数据类型起一个新的名字。

通过typedef关键字,我们可以简化复杂数据类型的使用,增强程序的可读性和可维护性。

二、typedef的语法格式typedef 的语法格式如下:typedef 原类型名新类型名;其中,原类型名可以是基本数据类型(int、char、float等)、结构体、联合体或枚举类型,新类型名是我们想要定义的新类型的名称。

三、使用typedef定义基本数据类型1. 定义int类型我们可以使用typedef定义一个新的int类型:typedef int Integer;这样,我们就可以用Integer代表int类型,使用起来更加直观和易读。

2. 定义char类型同样的,我们也可以使用typedef定义一个新的char类型:typedef char Letter;这样,我们就可以用Letter代表char类型,使得代码更加易懂。

3. 定义float类型typedef关键字也可以用来定义新的float类型:typedef float Realnum;这样,我们就可以用Realnum代表float类型,让程序更易读易懂。

四、使用typedef定义结构体类型1. 定义结构体类型通过typedef关键字,我们可以给结构体类型起一个新的名字:typedef struct{int age;char name[20];} Person;这样,我们就可以使用Person代表这个结构体类型,方便我们在程序中使用。

2. 定义结构体类型的指针我们还可以使用typedef定义结构体类型的指针,例如:typedef struct{int age;char name[20];} Person, *PersonPtr;这样,我们可以使用PersonPtr代表指向该结构体类型的指针,使得代码更加清晰易懂。

五、使用typedef定义联合体类型1. 定义联合体类型typedef关键字还可以用来定义联合体类型,例如:typedef union{int i;char c;float f;} Data;这样,我们就可以用Data代表这个联合体类型,方便我们在程序中使用。

c语言中typedef用法

c语言中typedef用法

c语言中typedef用法在C语言中,`typedef`是一个关键字,用于为已知的数据类型定义一个新的名字。

这个新名字可以让变量更具描述性,或者简化一些复杂的类型声明。

`typedef`的作用相当于为现有类型创建一个别名。

`typedef`的用法有以下几种:1. 为基本数据类型定义别名:```ctypedef unsigned int size;typedef unsigned int16 u16;typedef unsigned int8 u8;```在这个例子中,`size`、`u16`和`u8`分别是`unsigned int`、`unsigned int16`和`unsigned int8`的别名。

2. 为结构体定义别名:```ctypedef struct tagMyStruct {int iNum;long lLength;} MyStruct;```这个例子中,`MyStruct`是一个结构体的别名,该结构体包含两个成员:`int iNum`和`long lLength`。

3. 为枚举类型定义别名:```ctypedef enum {yes,no} YesNo;```在这个例子中,`YesNo`是`enum`类型的别名,包含两个枚举值:`yes`和`no`。

4. 为数组定义别名:```ctypedef uint8 MyArray[6];```这个例子中,`MyArray`是一个包含6个`uint8`类型元素的数组的别名。

总之,`typedef`在C语言中的主要用途是为现有数据类型创建别名,以便让变量更具描述性或简化类型声明。

typedef定义的新类型名与其对应的原类型名具有相同的语法和语义,但具有更清晰的含义。

typedef用法小结

typedef用法小结
用途三:
用typedef来定义与平台无关的类型。
比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:
typedef long double REAL;
在不支持 long double 的平台二上,改为:
typedef double REAL;
原因在于const给予了整个指针本身以常量性,也就是形成了常量指针char* const。
简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
**************************************************************************************
/* 这个C程序员都知道,就是将DataType定义为int型,便于扩充 */
typedef int DataType;
/* 定义一个一维数组,数组的元素维整型值 */
typedef DataType ARR1[N4];
/* 再定义一个一维数组,数组的元素维ARR1型,不过ARR1又是一个数组,所以
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////

c语言结构体定义typedef

c语言结构体定义typedef

c语言结构体定义typedefC语言结构体定义typedefC语言是一种非常流行的编程语言,广泛应用于嵌入式系统、操作系统以及各种应用程序的开发中。

在C语言中,结构体是一种非常重要的数据类型,它允许我们将不同的数据类型组合在一起,形成一个新的数据类型。

为了方便使用结构体,C语言提供了typedef关键字,使我们能够为结构体定义一个新的名称。

那么,下面就让我们一步一步地探讨typedef在C语言结构体定义中的作用和使用方法。

第一步:了解结构体的基本概念在开始使用typedef关键字定义结构体之前,我们首先需要了解结构体的基本概念。

结构体是由多个不同数据类型的变量组成的复合数据类型。

它允许我们将不同类型的数据组合在一起,形成一个整体,方便我们对这些数据进行统一管理和操作。

结构体的定义由关键字"struct"开始,后面跟着结构体的名称,再加上一对大括号,用于定义结构体的成员变量。

例如,我们可以定义一个包含学生信息的结构体如下:cstruct Student {int id;char name[20];int age;};上面的代码定义了一个名为Student的结构体,它包含了一个整型变量id、一个字符数组name和一个整型变量age。

第二步:使用typedef为结构体定义新的名称在上面的代码中,我们可以看到结构体的定义必须以struct关键字开头。

当我们想要使用这个结构体类型时,需要每次都写上struct关键字,这样显得比较冗长。

为了简化代码,C语言提供了typedef关键字,使我们能够为结构体定义一个新的名称。

使用typedef的语法如下:ctypedef struct {int id;char name[20];int age;} Student;在上面的代码中,我们使用typedef关键字为结构体定义了一个新的名为Student的名称。

这样,我们就可以直接使用Student作为结构体类型,而无需每次都写上struct关键字了。

C语言中Typedef的使用方法

C语言中Typedef的使用方法

C语言中Typedef的使用方法3李 钢,黄湘萍,许 焰(长沙大学机电工程系,湖南长沙 410003)摘 要:在C语言中,除可以直接使用标准类型名(如int、char、float、double等)和自定义的结构体、共用体、指针、枚举类型外,还可以用Typedef定义新的类型名来代替已有的类型名1如果能熟练使用Ty2 pedef,将有利于建立与平台无关的数据类型,甚至能隐藏一些复杂和难以理解的语法,避免一些常见的错误,从而使C程序代码更灵活1关键词:变量;数据类型;结构体;指针中图分类号:TP312 文献标识码:A 文章编号:100824681(2007)0920070204 typedef声明,简称typedef,为现有的数据类型创建一个新的名字1用typedef定义新的类型名后,对于结构体、共用体或枚举类型,使用它们定义或说明变量时,不必再冠以类型类别关键字,一般常使用typedef来编写更为美观和可读性较强的代码.所谓美观,即指typedef能隐藏较笨拙的语法构造以及平台相关的数据类型,从而增强程序的可移植性、以及将来的可维护性1本文将揭示typedef 强大功能11 C语言中typedef基本用法[1,2,3]typedef为C语言的关键字,作用是为一种数据类型定义一个新名字1这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(st ruct 等)1在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明11.1 typedef的最简单使用typedef int integer;给已知数据类型int定义为integer,这样,以下两行代码是等价的:int a,b;integ a,b;1.2 typedef与结构结合使用typedef st ruct tagMyStruct {int iNum; long lLengt h; }MySt ruct;这组语句实际上完成两个操作:1.2.1 定义一个新的结构类型st ruct tagMySt ruct {int iNum; long lLengt h;};1.2.2 typedef为这个新的结构起了一个名字,叫MySt ructtypedef st ruct tagMySt ruct MyStruct;分析:tagMySt ruct称为“tag”,即“标签”,实际上是一个临时名字,关键字st ruct和tagMySt ruct 一起,构成了这个结构类型,不论是否有typedef,这个结构都存在1可以用st ruct tagMySt ruct varName来定义变量,但要注意,使用tagMySt ruct varName来定义变量是不对的,因为st ruct和tagMySt ruct合在一起才能表示一个结构类型1因此,MyStruct实际上相当于st ruct tagMy2 St ruct,可以使用MySt ruct varName来定义变量11.3 typedef可定义指针、数组、枚举等类型typedef还可以定义指针、数组、枚举类型等数据类型,如:(1)typedef int num[100];//声明num为整型数组类型num n;//定义n为整型数组变量(2)typedef char3st ring;//声明st ring为字符指针类型3收稿日期:2007205222;修回日期:2007206219作者简介:李 钢(1965-)男,湖南长沙人,长沙大学机电工程系实验师1研究方向:计算机网络与计算机管理.st ring p,s[10];//定义p为字符指针变量,s为指针数组(3)typedef int(3pointer)()//声明pointer为指向函数的指针类型,该函数返回整型值pointer p1,p2;//定义p1、p2为pointer类型的指针变量(4)typedef enum{sun,mon,t ues,wed,t hur,f ri sat}days;//声明days为枚举类型days today;//定义today为days类型的变量2 typedef和结构的问题至于typedef到底有什么微妙之处,可以从下面的几个问题得到答案1当用下面的代码定义一个结构时,编译器会报类型错误1typedef st ruct tagNode {char3p Item; pNode pNext; }3p Node;C语言允许在结构中包含指向它自己的指针,这可以从建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用1根据前面的阐述可以知道:新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字不存在,也就是说这个时候编译器根本不能识别pNode1解决这个问题的方法下列3种:(1)常用方法有两种:①typedef struct tagNode{char3p Item; st ruct tagNode3pNext;}3pNode;②typedef struct tagNode3pNode;st ruct tagNode{char3p Item; p Node p Next;};注意:这个例子中,typedef给一个还未完全声明的类型起新名字1C语言编译器支持这种做法1(2)规范做法:st ruct tagNode{char3p Item; st ruct tagNode3pNext;};typedef st ruct tagNode3pNode;3 typedef和#def ine的问题[1,2]有下面两种定义p St r数据类型的方法,两者有什么不同?哪一种更好一点?typedef char3p St r;#define p Str char3;通常,typedef要比#define要好,特别是在有指针的场合1typedef char3p St r1;#define p Str2char3;p St r1s1,s2;p St r2s3,s4;在上述的变量定义中,s1、s2、s3都被定义为char3,而s4则定义成了char,不是所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字1#define用法例子:#define f(x)x3xmain() {int a=6,b=2,c; c=f(a)/f(b); p rintf("%d\n",c); }程序的输出结果是:361因此,在C语言编程规范中,使用#define定义时,如果定义中包含表达式,必须使用括号,则上述定义应该如下定义才对:#define f(x)(x3x)如果使用typedef就没有这样的问题出现1typedef和#define的另一例下面的代码在编译器中也会出问题:typedef char3p St r;char st ring[4]="abc";co nst char3p1=st ring;co nst p St r p2=st ring;p1++;p2++;是p2++出错了1这个问题再一次说明:ty2 pedef和#define不同,它不是简单的文本替换1上述代码中const p St r p2并不等于const char3 p21const p St r p2和const long x本质上没有区别,都是对变量进行只读限制,只是此处的变量p2数据17 总第79期 李 钢,黄湘萍,许 焰 C语言中Typedef的使用方法类型是自定义的而不是系统固有类型1因此,co nst p St r p2的含义是:限定数据类型为char3的变量p2为只读,因此p2++错误1#define与typedef的区别:(1)#define宏定义有一个特别的长处:可以使用#if def,#if ndef等来进行逻辑判断,还可以使用#undef来取消定义1(2)typedef也有一个特别的长处:它符合范围规则,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性1这里有两点值得注意:(1)用typedef只是给已有类型增加1个别名,并不能创造1个新的类型1(2)typedef与#define有相似之处,但二者是不同的:前者是由编译器在编译时处理的;后者是由编译预处理器在编译预处理时处理的,而且只能作简单的字符串替换14 typedef复杂的变量声明在编程实践中,尤其是看别人代码的时候,常常会遇到比较复杂的变量声明,使用typedef作简化自有其价值,比如:下面是三个变量的声明,如想使用typdef分别给它们定义一个别名,该如何做?(1)int3(3a[5])(int,char3);(2)void(3b[10])(void(3)());(3)doube(3)()(3pa)[9];对复杂变量建立一个类型别名的方法很简单,只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了1(1)int3(3a[5])(int,char3);//p Fun是新建的一个类型别名typedef int3(3p Fun)(int,char3);//使用定义的新类型来声明对象,等价于int3 (3a[5])(int,char3);p Fun a[5];(2)void(3b[10])(void(3)());//首先为void(3)声明一个新类型typedef void(3p FunParam)();//整体声明一个新类型typedef void(3p Fun)(p FunParam);//使用定义的新类型来声明对象,等价于void (3b[10])(void(3)());p Fun b[10];(3)doube(3)()(3pa)[9];//首先为doube(3)()声明一个新类型typedef double(3p Fun)();//整体声明一个新类型typedef p Fun(3p FunParam)[9];//使用定义的新类型来声明对象,等价于doube(3)()(3pa)[9];p FunParam pa;5 创建平台无关的数据类型,隐藏笨拙且难以理解的语法 使用typedef s为现有类型创建同义字1定义易于记忆的类型名typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图1类型出现在所声明的变量名字中,位于“typedef”关键字右边1例如:typedef int size;此声明定义了一个int的同义字,名字为size1注意typedef并不创建新的类型1它仅仅为现有类型添加一个同义字1可以在任何需要int的上下文中使用size:void measure(size3p sz);size array[4];size len=file.getlengt h();st d::vector vs;typedef还可以掩饰符合类型,如指针和数组1不用象下面这样重复定义有81个字符元素的数组: char line[81];char text[81];定义一个typedef,每当要用到相同类型和大小的数组时,可以这样:typedef char Line[81];Line text,secondline;getline(text);同样,也可以象下面这样隐藏指针语法:typedef char3p st r;int myst rcmp(p str,p st r);这里将带来个typedef的一个误区1标准函数strcmp()有两个‘const char3’类型的参数1因此,有可能会误导用象下面这种方式声明mystrcmp ():int myst rcmp(const p st r,const p st r);这种方式是错误的,按照顺序,‘const p st r’被解27长沙大学学报 2007年9月 释为‘char3const’(一个指向char的常量指针),而不是‘const char3’(指向常量char的指针)1正确解决这个问题的方法是:typedef const char3cp st r;int myst rcmp(cp st r,cp str);只要为指针声明typedef,那么都要在最终的typedef名称中加一个const,以使得该指针本身是常量,而不是对象16 代码简化上面讨论的typedef行为有点像#define宏,用其实际类型替代同义字1不同点是typedef在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换1例如:typedef int(3PF)(const char3,const char 3);这个声明引入了PF类型作为函数指针的同义字,该函数有两个const char3类型的参数以及一个int类型的返回值1如果要使用下列形式的函数声明,那么上述这个typedef是不可或缺的: PF Register(PF pf);Register()的参数是一个PF类型的回调函数,返回某个函数的地址,其署名与先前注册的名字相同1如果不用typedef,将如何实现这个声明的: int(3Register(int(3pf)(const char3, const char3)))(const char3,const char3);很难理解这是什么意思,更不用说这种费解的代码会带来什么风险1在这里使用typedef是一种必需17 促进跨平台开发typedef还有另一个重要的用途,那就是定义与机器无关的类型1如可以定义一个叫REAL的浮点类型,在目标机器上它可以获得最高的精度:typedef long double REAL;在不支持long double的机器上,该typedef看起来会是下面这样:typedef double REAL;并且,在连double都不支持的机器上,该ty2 pedef看起来会是这样:typedef float REAL;不用对源代码做任何修改便可以在每一种平台上编译这个使用REAL类型的应用程序1唯一需要改的是typedef函数本身1在大多数情况下,这个微小的变动完全都可以通过编译来自动实现18 小结Typedef声明符的使用使得C语言程序在可移植性、简洁性方面有较大提高,极详细分析了常见的Ⅷ种使用方法及其使用后在程序改进方面的变化,由此可以看出typedef声明符的强大功能,事实上typedef应该还有更多的应用有待进一步挖掘,灵活运用typedef会对C语言编写带来更多的好处1参考文献:[1]杨路明.C语言程序设计教程[M].北京:北京邮电大学出版社,2005.[2]谭浩强.C程序设计[M].北京:清华大学出版社,1991.[3]潘金贵,沈默君,谢俊元,等.TORBO语言及其程序设计[M].南京:南京大学出版社,1988.(作者本人校对)37 总第79期 李 钢,黄湘萍,许 焰 C语言中Typedef的使用方法。

C语言typedef用法总结

C语言typedef用法总结

C语言typedef用法总结黄海涛,2012-3-11C语言中的typedef可以让人感觉很清新,但也可以让人感觉神秘。

当你一层层剥开它的时候,神秘的面纱终会摘下……让我们一起来探究其中的秘密吧!一、概述1、类型定义符typedefC语言提供了一个称为typedef的工具,它允许你为各种数据类型定义新的名字。

定义形式:typedef 原类型名新类型名;它的格式与变量声明完全一样,只是把typedef这个关键字放在声明的前面,但typedef并不创建变量,而是为指定类型引入一个新的名字。

2、实质其实质是:为现有类型取个新名字,它并没有引入新的类型。

typedef是一种声明形式,它为一种类型引入新的名字,而不是产生新的类型,也不会为变量分配空间。

3、作用时机在某些方面,typedef类似于宏文本替换,但typedef是类型定义符,在编译时会有相应类型的检查。

typedef是由编译器解释的。

▲typedef与#define的区别A.#define后面没有分号,而typedef后面有分号;B.#define不是关键字,而typedef是关键字;C.宏定义中宏名紧跟着#define,而typedef中的类型名并不紧接其后;D.可以用其他类型说明符对宏名进行扩展,但对typedef定义的类型名却不行;例如:E.在连续几个变量声明中,typedef定义的类型名可以保证声明中所有的变量均为同一种类型,而#define定义的宏名则无法保证。

4、使用原因1)表达方式更简洁,简化编程;2)使程序参数化,提高程序的可移植性;3)为程序提供更好的说明性,可以引入一个易记且意义明确的新名字,提升可维护性。

5、缺点允许一些看上去混乱的语法,可以把几个声明放在一个声明中。

如:二、使用typedef声明定义时的限制1、2、3、存储类关键字:auto、extern、register、static与typedef但在存储类说明符中,typedef是个例外,它不会真正影响对象的存储特性。

typedef int bool用法

typedef int bool用法

typedef int bool用法
在C语言中,`typedef`用于为已有的数据类型定义一个新的名字。

因此,`typedef int bool;`的意思是定义了一个新的类型名`bool`,它代表了整数类型`int`。

通常,在C语言中,布尔类型是通过宏定义来定义的,例如:
```c
define bool int
define true 1
define false 0
```
然而,在某些情况下,使用`typedef`可以更清晰地表示意图,因为它提供了一个更明确的类型名称。

以下是一个简单的示例,展示了如何使用`typedef int bool;`:
```c
include <>
typedef int bool; // 定义 bool 为 int 类型
int main() {
bool a = true; // 实际上是 int a = 1;
bool b = false; // 实际上是 int b = 0;
printf("a: %d, b: %d\n", a, b); // 输出: a: 1, b: 0
return 0;
}
```
在这个示例中,我们定义了一个新的类型`bool`,它是整数类型`int`的别名。

然后,我们声明了两个变量`a`和`b`,分别初始化为`true`和`false`,实际上
是初始化为整数1和0。

最后,我们使用`printf`函数打印出这两个变量的值。

c语言结构体指针 typedef

c语言结构体指针 typedef

C语言中的结构体指针与typedef一、结构体指针的概念结构体是C语言中一种复合类型,它由若干数据成员组成,我们可以通过定义结构体变量的方式来使用结构体类型。

当我们需要在函数间传递结构体变量或在函数中动态创建结构体变量时,就需要使用结构体指针来进行操作。

二、结构体指针的定义和使用1. 定义结构体指针在C语言中,我们可以通过在结构体类型名称前加上"*"来定义结构体指针。

如果我们有一个名为Student的结构体类型,我们可以定义一个指向Student类型的指针变量ptr_stu如下所示:```struct Student {char name[20];int age;};struct Student *ptr_stu;```2. 结构体指针的初始化和使用我们可以通过使用取位置区域符""将结构体变量的位置区域赋给结构体指针,然后可以通过指针来访问结构体的成员变量。

假设我们有一个名为stu的结构体变量:```struct Student stu = {"John", 20};struct Student *ptr_stu = stu;printf("Name: s\n", ptr_stu->name);printf("Age: d\n", ptr_stu->age);```而在实际开发中,如果结构体类型名称较长或者需要频繁使用结构体指针,我们可以通过使用typedef来定义结构体指针类型,从而简化代码并提高可读性。

三、typedef关键字的介绍typedef是C语言中的关键字之一,它可以用来为一个已有的数据类型定义一个新的名称。

通过使用typedef,我们可以为复杂的数据类型定义更简洁、更易读的别名,从而提高代码的可维护性和可读性。

四、结构体指针的typedef用法1. 定义结构体指针类型我们可以通过使用typedef来定义结构体指针类型,从而可以直接使用新的类型名称来声明结构体指针变量。

TypedefStruct用法详解

TypedefStruct用法详解

TypedefStruct⽤法详解Typedef Struct ⽤法详解⼀、typedef的⽤法在C/C++语⾔中,typedef常⽤来定义⼀个标识符及关键字的别名,它是语⾔编译过程的⼀部分,但它并不实际分配内存空间。

实例像:typedef int INT;typedef int ARRAY[10];typedef (int*) pINT;typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“⾮直观性”等缺点。

⼆、#define的⽤法#define为⼀宏定义语句,通常⽤它来定义常量(包括⽆参量与带参量),以及⽤来实现那些“表⾯似和善、背后⼀长串”的宏,它本⾝并不在编译过程中进⾏,⽽是在这之前(预处理过程)就已经完成了,但也因此难以发现潜在的错误及其它代码维护问题,它的实例像:#define INT int#define TRUE 1#define Add(a,b) ((a)+(b));#define Loop_10 for (int i=0; i<10; i++)⽤法详解:1. #define 的变体,即 #ifndef,可以防⽌头头⽂件的重复引⽤。

#ifdef和 #define组合,⼀般⽤于头⽂件中,⽤以实现防⽌多个⽂件对此同⼀个头⽂件的重复引⽤.实际使⽤中,即使你的头⽂件暂时没有被多个⽂件所引⽤,为了增加程序可读性,移植性,健壮性等,还是最好都加上。

其⽤法⼀般为:#ifndef <标识>#define <标识>……… // include or define sth.#endif<标识>在理论上来说可以是⾃由命名的,但每个头⽂件的这个“标识”都应该是唯⼀的 to void the definition duplication。

but normallz, 标识的命名规则⼀般是头⽂件名全⼤写,前后加下划线,并把⽂件名中的“.”也变成下划线,如:stdio.h对应的就是:#ifndef _STDIO_H_#define _STDIO_H_……… // include or define sth.#endif1. #define的变体,即#ifdef,可以实现加⼊⾃⼰需要的模块(源⽂件)[例⼦] 在源⽂件中加⼊#ifdef MYSELF_H#include "myself.c"#endif可以实现在源⽂件中加⼊myself.c的代码,将其实现的功能加进来, 即加⼊了myself模块。

c语言中typedef的用法

c语言中typedef的用法

c语言中typedef的用法
typedef是C语言中的一个关键字,其功能是对已有的数据类型进行重命名或定义新的数据类型。

1. 重命名已有的数据类型
通过typedef可以为已有的数据类型(如int、float、double等)起一个新的名字,这种形式也称为别名。

例如:
typedef int INTEGER;
typedef float REAL;
这样,以后就可以使用INTEGER代替int,REAL代替float,从而使程序更加易读易懂。

2. 定义新的数据类型
通过typedef可以定义新的数据类型,例如:
typedef struct {
char name[20];
int age;
float height;
float weight;
} PERSON;
这样,就定义了一个名为PERSON的结构体类型,这个类型包含了一个名为name的字符数组、一个名为age的整型变量、一个名为height和weight的浮点变量。

这种形式也叫做类型定义。

使用typedef还可以定义指向函数的指针类型,例如:
typedef int (*PFN)(int, int);
这里定义了一个类型PFN,它是一个指向函数的指针类型,该函数返回值为int,接受两个int类型的参数。

总之,typedef是非常灵活的,它可以方便地定义复杂的数据类型,提高代码的
可读性和可维护性。

C中typedef函数指针的使用

C中typedef函数指针的使用

C中typedef函数指针的使⽤类型定义的语法可以归结为⼀句话:只要在变量定义前⾯加上typedef,就成了类型定义。

这⼉的原本应该是变量的东西,就成为了类型。

int integer; //整型变量int *pointer; //整型指针变量int array [5]; //整型数组变量int *p_array [5]; //整型指针的数组的变量int (*array_pointer) [5];//整型数组的指针的变量int function (int param);//函数定义,也可将函数名看作函数的变量int *function (int param);//仍然是函数,但返回值是整型指针int (*function) (int param);//现在就是指向函数的指针了若要定义相应类型,即为类型来起名字,就是下⾯的形式:typedef int integer_t; //整型类型typedef int *pointer_t; //整型指针类型typedef int array_t [5]; //整型数组类型typedef int *p_array_t [5]; //整型指针的数组的类型typedef int (*array_pointer_t) [5]; //整型数组的指针的类型typedef int function_t (int param); //函数类型typedef int *function_t (int param); //函数类型typedef int (*function_t) (int param); //指向函数的指针的类型注意:上⾯的函数类型在C中可能会出错,因为C中并没有函数类型,它的函数变量会⾃动退化成函数指针;在C++中好像是可以的。

在这⾥主要说明的是形式上的相似性.typedef的⼀般形式为:typedef 类型定义名;注意:上述⼀般形式中最后的分号不可缺少!在编程中使⽤typedef⽬的⼀般有两个,⼀个是给变量⼀个易记且意义明确的新名字,另⼀个是简化⼀些⽐较复杂的类型声明。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Typedef 声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的 语法。不管怎样,使用 typedef 能为代码带来意想不到的好处,通过本 文你可以学习用 typedef 避免缺欠,从而使代码更健壮。 typedef 声明,简称 typedef,为现有类型创建一个新的名字。比如人们 常常使用 typedef 来编写更美观和可读的代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和 以及未来的可维护性。本文下面将竭尽全力来揭示 typedef 强大功能以 及如何避免一些常见的陷阱。 如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法? 使用 typedefs 为现有类型创建同义字。 定义易于记忆的类型名 typedef 使用最多的地方是创建易于记忆的类型名,用它来归档程序员 的意图。类型出现在所声明的变量名字中,位于 ''typedef'' 关键字右 边。例如: typedef int size; 此声明定义了一个 int 的同义字,名字为 size。注意 typedef 并不创建新 的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要 int 的 上下文中使用 size: void measure(size * psz); size array[4]; size len = file.getlength(); std::vector <size> vs; typedef 还可以掩饰符合类型,如指针和数组。例如,你不用象下面这
C语言中typedef用法 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这 里的数据类型包括内部数据类型(int,char等)和自定义的数据类型 (struct等)。 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明 确的新名字,另一个是简化一些比较复杂的类型声明。 至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述。 2. typedef & 结构的问题 当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫 非C语言不允许在结构中包含指向它自己的指针吗?请你先猜想一下, 然后看下文说明:
样重复定义有 81 个字符元素的数组:
char line[81];
char text[81];
定义一个 typedef,每当要用到相同类型和大小的数组时,可以这样:
typedef char Line[81];
Line text, secondline;
getline(text);
同样,可以象下面这样隐藏指针语法:
>3. doube(*)() (*pa)[9]; //首先为上面表达式蓝色部分声明一个新类型 typedef double(*pFun)(); //整体声明一个新类型 typedef pFun (*pFunParam)[9]; //使用定义的新类型来声明对象,等价于doube(*)() (*pa)[9]; pFunParam pa;
typedef char * pstr;
int mystrcmp(pstr, pstr);
这里将带我们到达第一个 typedef 陷阱。标准函数 strcmp()有两个‘const
char
*'类型的参数。因此,它可能会误导人们象下面这样声明
mystrcmp():
int mystrcmp(const pstr, const pstr);
typedef struct tagNode { char *pItem; pNode pNext; } *pNode; 答案与分析: 1、typedef的最简单使用 typedef long byte_4; 给已知数据类型long起个新名字,叫byte_4。 2、 typedef与结构结合使用 typedef struct tagMyStruct { int iNum; long lLength; } MyStruct; 这语句实际上完成两个操作: 1) 定义一个新的结构类型 struct tagMyStruct { int iNum; long lLength; }; 分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字, struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有 typedef,这个结构都存在。
函数声明,那么上述这个 typedef 是不可或缺的:
PF Register(PF pf);
Register() 的参数是一个 PF 类型的回调函数,返回某个函数的地址,其
署名与先前注册的名字相同。做一次深呼吸。下面我展示一下如果不用
typedef,我们是如何实现这个声明的:
int (*Register (int (*pf)(const char *, const char *)))
typedef struct tagNode *pNode; 3. typedef & #define的问题 有下面两种定义pStr数据类型的方法,两者有什么不同?哪一种更好一 点?
typedef char *pStr; #define pStr char *; 答案与分析: 通常讲,typedef要比#define要好,特别是在有指针的场合。请看例子: typedef char *pStr1; #define pStr2 char *; pStr1 s1, s2; pStr2 s3, s4; 在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了 char,不是我们所预期的指针变量,根本原因就在于#define只是简单的 字符串替换而typedef则是为一个类型起新名字。 #define用法例子: #define f(x) x*x main( ) { int a=6,b=2,c; c=f(a) / f(b); printf("%d \\n",c); } 以下程序的输出结果是: 36。 因为如此原因,在许多C语言编程规范中提到使用#define定义时,如果 定义中包含表达式,必须使用括号,则上述定义应该如下定义才对:
我们可以用struct tagMyStruct varName来定义变量,但要注意,使用 tagMyStruct varName来定义变量是不对的,因为struct 和tagMyStruct合 在一起才能表示一个结构类型。 2) typedef为这个新的结构起了一个名字,叫MyStruct。 typedef struct tagMyStruct MyStruct; 因此,MyStruct实际上相当于struct tagMyStruct,我们可以使用MyStruct varName来定义变量。 答案与分析 C语言当然允许在结构中包含指向它自己的指针,我们可以在建立链表 等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于 typedef的应用。 根据我们上面的阐述可以知道:新结构建立的过程中遇到了pNext域的 声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类 型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是 说这个时候编译器根本不认识pNode。 解决这个问题的方法有多种: 1)、 typedef struct tagNode { char *pItem; struct tagNode *pNext; } *pNode; 2)、 typedef struct tagNode *pNode; struct tagNode { char *pItem; pNode pNext; }; 注意:在这个例子中,你用typedef给一个还未完全声明的类型起新名 字。C语言编译器支持这种做法。 3)、规范做法: struct tagNode { char *pItem; struct tagNode *pNext; };
>2:void (*b[10]) (void (*)()); //首先为上面表达式蓝色部分声明一个新类型 typedef void (*pFunParam)(); //整体声明一个新类型 typedef void (*pFun)(pFunParam); //使用定义的新类型来声明对象,等价于void (*b[10]) (void (*)()); pFun b[10];
#define f(x) (x*x) 当然,如果你使用typedef就没有这样的问题。 4. typedef & #define的另一例 下面的代码中编译器会报一个错误,你知道是哪个语句错了吗?
typedef char * pStr; char string[4] = "abc"; const char *p1 = string; const pStr p2 = string; p1++; p2++; 答案与分析:
这是错误的,按照顺序,‘const pstr'被解释为‘char * const'(一个指向
char 的常量指针),而不是‘const char *'(指向常量 char 的指针)。这
个问题很容易解决:
typedef const char * cpstr; //注意这里用来被替换名称的是const char * 三
是p2++出错了。这个问题再一次提醒我们:typedef和#define不同,它不 是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。 const pStr p2和const long x本质上没有区别,都是对变量进行只读限制, 只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而 已。因此,const pStr p2的含义是:限定数据类型为char *的变量p2为只 读,因此p2++错误。 #define与typedef引申谈 1) #define宏定义有一个特别的长处:可以使用 #ifdef ,#ifndef等来进行逻 辑判断,还可以使用#undef来取消定义。 2) typedef也有一个特别的长处:它符合范围规则,使用typedef定义的变 量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义 的位置),而宏定义则没有这种特性。 5. typedef & 复杂的变量声明 在编程实践中,尤其是看别人代码的时候,常常会遇到比较复杂的变量 声明,使用typedef作简化自有其价值,比如: 下面是三个变量的声明,我想使用typdef分别给它们定义一个别名,请 问该如何做? >1:int *(*a[5])(int, char*); >2:void (*b[10]) (void (*)()); >3. doube(*)() (*pa)[9]; 答案与分析: 对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明 表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头 就行了。 >1:int *(*a[5])(int, char*); //pFun是我们建的一个类型别名 typedef int *(*pFun)(int, char*); //使用定义的新类型来声明对象,等价于int* (*a[5])(int, char*); pFun a[5];
相关文档
最新文档