介绍
typedef在c语言中主要是用来声明数据类型的别名的,比如我们可以用来代替系统默认的类型名称,数组、字符串、指针类型、字典等各种各样的类型。当我们声明了我们想要的别名后就可以使用我们声明的别名来定义变量的类型。
四种常用的方式
一:基本数据类型
//无符号整型
typedef unsigned int WMINT;
WMINT i =0;
//……
二:定义结构体
A、普通未声明的写法
struct point{
int x;
int y;
int z;
};
struct pointp = {1,2,3};
B、声明后的写法
typedef struct point2 {
int a;
int b;
int c;
} P;
P s = {2,2,2};
或者
struct point2 {
int a;
int b;
int c;
};
typedef point2 P2;
P2 s2 ={2,2,2};
Oc枚举
typedef NS_ENUM(NSInteger, WMNetWorkType) {
Unknown = -1,
NotReachable =0,
ReachableViaWWAN =1,
ReachableViaWiFi =2,
};
WMNetWorkType network =Unknown;
三:字符串数组
//字符串 oc
typedef NSString WMNSString;
WMNSString* string = [WMNSString stringWithFormat:@"”];
//数组 c
typedef int WMNewINT100 [100];
WMNewINT100 arr;
四:指针类型
typedef char* WMChar;
WMChar charr =0;
注意事项:
一:
下面代码有什么问题
typedef char* P;
int strcmp(const P,const P);
在上面的代码中,“const P” 是否相当于 “const char*” 呢?
答案是否定的,原因很简单,typedef 是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换。因此,“const P”中的 const 给予了整个指针本身常量性,也就是形成了常量指针“char*const(一个指向char的常量指针)”。即它实际上相当于“char*const”,而不是“const char*(指向常量 char 的指针)”。当然,要想让 const P 相当于 const char* 也很容易,如下面的代码所示:
typedef const char* P;
int strcmp(P, P);
其实,无论什么时候,只要为指针声明 typedef,那么就应该在最终的 typedef 名称中加一个 const,以使得该指针本身是常量。
二、
还需要特别注意的是,虽然 typedef 并不真正影响对象的存储特性,但在语法上它还是一个存储类的关键字,就像 auto、extern、static 和 register 等关键字一样。因此,像下面这种声明方式是不可行的:
typedef static int INT_STATIC;
不可行的原因是不能声明多个存储类关键字,由于 typedef 已经占据了存储类关键字的位置,因此,在 typedef 声明中就不能够再使用 static 或任何其他存储类关键字了。当然,编译器也会报错,如在 VC++2010 中的报错信息为“无法指定多个存储类”。
网友评论