美文网首页
typedef的用法

typedef的用法

作者: 黄_龙 | 来源:发表于2019-06-10 14:09 被阅读0次

一、typedef的用法

①:定义一种类型的别名,但不是简单的宏替换。

通常来说,typedef要比#define要好,特别是在有指针的场合:

typedef   char* pStr1;

#define pStr2  char*;

pStr1  s1,s2;

pStr2  s3,s4; 

在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们所预期的指针变量(相当于:char *s3,s4;)。根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。

再看,先定义:

typedef char* PSTR;

然后:

int mystrcmp(const PSTR, const PSTR);

const PSTR实际上相当于const char*吗?不是的,它实际上相当于char* const。

原因在于const给予了整个指针本身以常量性,也就是形成了常量指针char* const。

简单来说,记住当const和typedef一起出现时,typedef不会是简单的字符串替换就行。

插播1)const char *ptr;

定义一个指向字符常量的指针,这里,ptr是一个指向 char* 类型的常量,所以不能用ptr来修改所指向的内容,换句话说,*ptr的值为const,不能修改。但是ptr的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对ptr而言,这个值是常量。实验如下:ptr指向str,而str不是const,可以直接通过str变量来修改str的值,但是确不能通过ptr指针来修改。

char str[]="hello world";

const  char *ptr=str;

char ss[]="new world";

ptr[0]='i';//通过ptr修改会报错:assignment of read-only location '* ptr'....

str[0]='j';//通过str修改是可以的>>"jello world"

ptr=ss;//可以通过重新赋值给该指针,来修改指针指向的值

插播2)char const *ptr;

此种写法和const char *等价

插播3)char * const ptr;

定义一个指向字符的指针常数,即const指针,实验得知,不能修改ptr指针,但是可以修改该指针指向的内容。

char str[]="hello world";

const  char *ptr=str;

char ss[]="new world";

ptr[0]='i';//通过ptr修改正常

ptr=ss;//重新赋值给该指针,会报错:assignment of read-only variable 'ptr'

const char *ptr==char const *ptr;  可以直接改变指针指向,但不能直接改变指针指向的值;

char *const ptr; 可以直接改变指针指向的值,但不能直接改变指针指向;

②:用typedef来定义与平台无关的类型。

比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:

typedef long double REAL; 

在不支持 long double 的平台二上,改为:

typedef double REAL; 

在连 double 都不支持的平台三上,改为:

typedef float REAL; 

也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。

标准库就广泛使用了这个技巧,比如size_t。

另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健(虽然用宏有时也可以完成以上的用途)。

③:为复杂的声明定义一个新的简单的别名。

在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。

原声明:int *(*a[5])(int, char*);

变量名为a,直接用一个新别名pFun替换a就可以了:

typedef int *(*pFun)(int, char*); 

原声明的最简化版:

pFun a[5];

a本身是一个数组,里面保存的是指针类型的元素。

④:和struct搭配使用

见第二部分;

二、struct和typedef struct的区别

在C语言,声明struct新对象时,必须要带上struct,即形式为: struct 结构名 对象名,如:

struct point{

int x;

int y;

};

struct point p;

而在C++中,则可以直接写:结构名 对象名,即:

point p;

所以可以使用typedef和struct一起使用:

typedef struct point{

int x;

int y;

}Point;

Point p;

这样就省去了struct。

在struct中定义自己的指针:

typedef struct point{

int x;

int y;

struct point *next;

}Point;

或者:

typedef struct point *Point;

struct point{

int x;

int y;

Point next;

};

在C++中可以直接:

typedef struct point{

int x;

int y;

point *next;

}Point;

struct在代码中常见两种形式:

struct A{

int x;

int y;

};

struct{

int x;

int y;

}A;

前一种是结构体类型定义,定义{}中的结构为一个名称是“A”的结构体。

使用:

A     a;

a.x;

或者:

typedef struct TagA{

int x;

int y;

}A;  //A为TagA的别名,是等同的。

后者是结构体变量定义,以{}中的结构,定义一个名称为”A”的变量。这里的结构体称为匿名结构体,是无法被直接引用的。

使用:

A.x;

或者:

typedef struct{

int x;

int y;

}A;  //定义匿名结构体的别名为A

注意上面两种的使用方法!!!

最后注意:

typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、register等一样),虽然它并不真正影响对象的存储特性,如:

typedef static int INT2; //不可行

编译将失败,会提示“指定了一个以上的存储类”。

相关文章

  • 代码注入

    typedef注意用法

  • Typedef 用法

    转自:Typedef用法总结 不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C...

  • typedef用法

    介绍 typedef在c语言中主要是用来声明数据类型的别名的,比如我们可以用来代替系统默认的类型名称,数组、字符串...

  • typedef的用法

    一、基本定义 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(...

  • typedef的用法

    一、typedef的用法 ①:定义一种类型的别名,但不是简单的宏替换。 通常来说,typedef要比#define...

  • typedef和typename

    一、typedef 用法:typedef 内置类型 别名 关键字typedef对内置类型、类类型等进行重命名,使用...

  • typedef

    typedef常见用法 1.常规变量类型定义 例如:typedef unsigned char uchar 描述:...

  • typedef、Const 用法

  • typedef的用法总结

    typedef的用法总结转载 2015年02月28日 13:40:16 标签:c++ 373第一、四个用途 用途一...

  • C typedef 的用法

    引言 C 语言提供了 typedef 关键字,您可以使用它来为类型取一个新的名字。 用法: 在实际应用中,主要有4...

网友评论

      本文标题:typedef的用法

      本文链接:https://www.haomeiwen.com/subject/fzoaxctx.html