访问电脑版页面

导航:老古开发网手机版51单片机

学C51的基础 11《 枚 举(enum) 》作者[cmh]©

导读:
关键字:
枚      举(enum)

    枚举是一个被命名的整型常数的集合, 枚举在日常生活中很常见。
    例如表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, 就是一个枚举。
    枚举的说明与结构和联合相似, 其形式为:

          enum 枚举名{
               标识符[=整型常数],
               标识符[=整型常数],
               ...
               标识符[=整型常数],
          } 枚举变量;

    如果枚举没有初始化, 即省掉"=整型常数"时, 则从第一个标识符开始, 顺次赋给标识符0, 1, 2,...。但当枚举中的某个成员
赋值后, 其后的成员按依次加1的规则确定其值。
    例如下列枚举说明后, x1, x2, x3, x4的值分别为0, 1, 2, 3。

     enum string{x1, x2, x3, x4}x;

    当定义改变成:

      enum string
      {
          x1,
          x2=0,
          x3=50,
          x4,
      }x;

    则x1=0, x2=0, x3=50, x4=51

    注意:
    1. 枚举中每个成员(标识符)结束符是",",  不是";", 最后一个成员可省略","。
    2. 初始化时可以赋负数, 以后的标识符仍依次加1。
    3. 枚举变量只能取枚举说明结构中的某个标识符常量。
    例如:
      enum string
      {
          x1=5,
          x2,
          x3,
          x4,
      };
     enum strig x=x3;
    此时, 枚举变量x实际上是7。

                             类   型   说   明

    类型说明的格式为:
     typedef 类型 定义名;
    类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型。这里类型是Turbo C许可的任何一种数据类型。定义名
表示这个类型的新名字。
    例如: 用下面语句定义整型数的新名字:
     typedef int SIGNED_INT;
    使用说明后, SIGNED_INT就成为int的同义词了, 此时可以用SIGNED_INT 定义整型变量。
    例如:  SIGNED_INT i, j;(与int i, j等效)。
    但 long SIGNED_INT i, j; 是非法的。
    typedef同样可用来说明结构、联合以及枚举。
    说明一个结构的格式为:

      typedef struct{
          数据类型  成员名;
          数据类型  成员名;
          ...
        } 结构名;

    此时可直接用结构名定义结构变量了。例如:

     typedef struct{
          char name[8];
          int class;
          char subclass[6];
          float math, phys, chem, engl, biol;
      } student;
      student Liuqi;

    则Liuqi被定义为结构数组和结构指针。
    在第二节讲过的文件操作中, 用到的FILE就是一个已被说明的结构, 其说明如下:

     typedef struct
     {
          short level;
          unsigned flags;
          char fd;
          unsigned char hold;
          short bsize;
          unsigned char *buffer;
          unsigned char *curp;
          unsigned istemp;
          short token;
     } FILE

    这个结构说明已包含在stdio.h中, 用户只要直接用FILE 定义文件指针变量就可以。事实上, 引入类型说明的目的并非为了方
便, 而是为了便于程序的移植。

                         预  处  理  指  令

    由ANSI的标准规定, 预处理指令主要包括:
     #define
     #error
     #if
     #else
     #elif
     #endif
     #ifdef
     #ifndef
     #undef
     #line
     #pragma
    由上述指令可以看出, 每个预处理指令均带有符号"#"。下面只介绍一些常用指令。

    1. #define 指令

    #define指令是一个宏定义指令, 定义的一般形式是:
     #define 宏替换名字符串(或数值)
    由#define指令定义后,  在程序中每次遇到该宏替换名时就用所定义的字符串(或数值)代替它。
    例如: 可用下面语句定义TRUE表示数值1, FALSE表示0。

     #define TRUE 1
     #define FALSE 0

    一旦在源程序中使用了TRUE和FALSE, 编译时会自动的用1和0代替。

    注意:
    1. 在宏定义语名后没有";"
    2. 在Turbo C程序中习惯上用大写字符作为宏替换名, 而且常放在程序开头。
    3. 宏定义还有一个特点, 就是宏替换名可以带有形式参数,  在程序中用到时, 实际参数会代替这些形式参数。
    例如:

     #define MAX(x, y) (x>y)?x:y
     main()
     {
          int i=10, j=15;
          printf("The Maxmum is %d", MAX(i, j);
     }

    上例宏定义语句的含义是用宏替换名MAX(x, y)代替x, y中较大者, 同样也可定义:

     #define MIN(x, y) (x

    程序也允许嵌入其它文件, 例如:

     main()
     {
          #include
     }

    其中help.c为另一个文件, 内容可为

       printf("Glad to meet you here!");

    上例编译时将按集成开发环境的Options/Directories/Include directories 中指定的包含文件路径查找被嵌入文件。

    4. #if、#else、#endif指令
    #if、#els和#endif指令为条件编择指令, 它的一般形式为:

     #if 常数表达式
          语句段;
     #else
          语句段;
     #endif

    上述结构的含义是: 若#if指令后的常数表达式为真, 则编译 #if到 #else 之间的程序段; 否则编译 #else 到 #endif 之间的
    程序段。

    例如:

     #define MAX 200
     main()
     {
          #if MAX>999
               printf("compiled for bigger\n");
          #else
               printf("compiled for small\n");
          #endif
     }

    5. #undef指令

    #undef指令用来删除事先定义的宏定义, 其一般形式为:

     #undef 宏替换名
    例如:

      #define TRUE 1
       ...
      #undef TURE
    #undef主要用来使宏替换名只限定在需要使用它们的程序段中。
来源:   作者:  2006/9/25 16:50:53
栏目: [ 51单片机]

相关阅读

学C51的基础 11《 枚 举(enum) 》作者[cmh]©

16X2字符型液晶显示模块的驱动

C51怎样在绝对地址定义变量呢?  

AT89S52的中文简介

pdata型变量是如何分页的,如果我想把pdata型变量定义到eram的>256字节的高地址,怎样用P2口输入地址

有关单片机ALE引脚的问题

c51单片机实用通信协议

51内核8位单片机MAX7651的开发环境

学C51的基础 8 《 控制流程语句 》 作者[cmh]©

数字温度传感器DS18B20的原理与应用

51单片机常见的7种时钟电路介绍

51单片机与PC机通信的设计

51单片机自然优先级与中断服务入口地址的设置

volatile的作用是什么 作者[hudaidai]©

AT89C51单片机与74LS164动态显示接口

51单片机实现显示器显示日历与时钟和温度的设计

学C51的基础4 《 变 量 》 作者[cmh]©

学C51的基础5《 运算符 》 作者[cmh]©

如何利用MCS-51单片机对周期波频率进行测量

linux环境下如何开发51单片机 基于codeblocks和SDCC