文章目录

  • 前言
  • 一、enum(枚举)
  • 二、typedef
  • 总结



前言

主要记录学习编程的经验和个人知识点总结,仅供学习用途。


提示:以下是本篇文章正文内容,主要讲 enum(枚举)和 typedef。

一、enum(枚举)

枚举是C语言中的一种基本数据类型,它可以让数据更简洁,更易读。
枚举语法定义格式为:

enum 枚举名
{
   枚举元素1,
   枚举元素2,
   ...
}枚举变量;

枚举名是自定义的一种数据数据类型名,而枚举变量为枚举名类型的一个变量,叫做枚举变量

枚举变量是对一个变量取值范围的限定,而花括号内是它的取值范围,枚举名类型的变量也就是枚举变量,它智能取值为花括号内的任何一个值,如果赋给枚举变量的值不在上述{ }列表内,则会报错或者警告。枚举元素也是枚举常量,常量一般为大写

比如一周有7天,如果不用枚举,采用#define为整数定义如下:

#define MON 1
#define YUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6
#define SUN 7

采用枚举的方式实现同样的功能:

enum DAY
{
   MON=1,TUE,WED,THU,FRI,SAT,SUN
};

enum DAY yesterday;
enum DAY today;
enum DAY tomorrow;//变量tomorrow的类型为枚举型enum DAY

注意:第一个枚举成员默认值为整型的0,后续枚举成员的值在前一个成员基础上加1,如果第一个枚举成员值定义为1,第二个就为2,以此类推。

二、typedef

typedef是C语言提供的关键字,可以使用它来为类型取一个新的名字。
例如:

typedef unsigned char BYTE;

在这个类型定义之后,标识符BYTE可以作为类型unsigned char的缩写,比如:

BYTE b1,b2;

按照惯例,定义时采用大写字母,提醒用户类型名称是一个象征性的缩写。

用途一:
定义一个类型的别名,而不是简单的宏替换。可以用作同时声明指针型的多个对象。
比如:

char * pa,pb; //只声明了一个指向字符变量的指针和一个字符变量


//以下可行
typedef char *PCHAR; //一般为大写
PCHAR pa,pb;   //可行,同时声明了两个只想字符变量的指针。

//虽然
char *pa,*pb;
//也可行,但是相对来说没有用typedef的形式直观,尤其在需要大量指针的地方,typedef的方式更省事。

用途2
用typedef关键字把枚举或者结构体定义成别名,并利用该别名进行变量声明:

typedef enum Workday1
{
    saturday,
    sunday,
    monday,
    tuesday,
    wednesday,
    thursday,
    friday
}workday;   //此处的workday为枚举型 enum Workday1的别名

workday today,tomorrow;//变量today和tomorrow的类型为枚举类型workday,也就是enum Workday1
typedef struct tagPOINT
   {
       int x;
       int y;       
   }POINT;
   POINT p1;

//没有typedef的话,只能使用如下定义
struct tagPOINT1 p1;

用途3
用 typedef 定义与平台无关的类型。
比如定义一个叫REAL的浮点类型,在目标平台上,让它表示最高精度的类型:

typedef long double REAL;

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

typedef double REAL;

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

typedef float REAL;

当程序跨平台时,只要改typedef本身就好了,不需要对别的源码做修改,可以在写代码时减少不必要的修改工作

用途4
为复杂的声明定义一个新的简单别名。

总结

总结:#define是C指令,用于为各种数据类型定义别名,与typedef类似,但是有以下不同:

  1. typedef仅限于为类型定义符号名称,#define不仅可以为类型定义别名,也能为数值定义别名。
  2. typedef是由编译器执行解释的,#define是由预编译器进行处理的。
  3. typedef一般情况下比**#define**要好,特别是在有指针的场合下,例如:
typedef char * pStr1;
#define pStr2 char *;
pStr1 s1,s2;
pStr2 s3,s4;

上述变量中,s1,s2,s3会被定义为char *,而s4则定义成了char,不是预期的指针变量,原因在于#define只是简单的字符串替换,而typedef是为一个类型起新名字。


参考资料:

  1. RUNOOB enum
  2. RUNOOB typedef
  3. BigCoder typedef
  4. liitdar typedef
  5. 哈哈呵h
  6. 目盼兮
  7. 一句话帮你理解typedef的用法
  8. C typedef 4种用法小结