C/C++ typedef 温习

typedef 作用:用来声明一个别名。

使用的场合有以下三种:
1) 定义一种类型的别名,属于编译过程的一部分,并不实际分配内存空间。
在这种使用场景下,typedef与define的作用相同;而不同点在于define声明的类型别名,只是一个简单的宏替换。
如:
char* pa, pb; 
typedef char* PCHAR;
#define PCHAR2 char*;
PCHAR s1, s2;
PCHAR2 s3, s4;
typedef int ARRAY[10];
typedef int(*PF)(void);
ARRAY m1;

定义的pa, s1, s2, s3 是一个指向字符变量的指针,pb,s4 是一个字符变量。
原因就在于#define只是简单的字符串替换,而typedef则是为一个类型起了一个别名。
Array是一个int[10]的别名,因此,m1是一个包含10个元素的int类型的数组。而PF是一个指向不带任何参数,返回值为int类型的函数指针。

2) 由于在以前的C代码中,声明struct新对象时,必须要带上struct,即:
struct 结构名 对象名;
而在C++中,则可以直接使用:
结构名 对象名;
为了少写一个struct对象,因此有了这样的写法:
typedef struct tagPoint{
  int x;
  int y;
}POINT;

POINT p1; 

3)用typedef 来定义与平台无关的类型。

使用陷阱:
陷阱一:
记住:typedef 定义了一种类型的别名。
以下那句编译会出错。
typedef char* PSTR;
char string[4] = "abc";
const char* p1 = string;
const PSTR p2 = string;
p1++;
p2++;

备注:p2++出错, 原因在于,typedef不是简单的宏替换,const PSTR p2 并不等于const char* p2
而是等于char* const p2;即定义了一个指向字符的常量指针,p2为只读不能进行任何修改。

陷阱二:
typedef 在语法上是一个存储类的关键字,和如auto,extern,mutable,static,register等一样,虽然实际上它并不影响对象存储的特性,
但是它不能上面列出来的存储类关键字一同使用作用在变量上。否则编译器会提示“指定了一个以上的存储类”。

你可能感兴趣的:(C/C++ typedef 温习)