【C语言】第九篇·枚举、定义类型和宏定义

来源:互联网 发布:恒生指数期货模拟软件 编辑:程序博客网 时间:2024/06/11 23:41

一、枚举类型
    1. C语言提供了一种称为“枚举”的类型。在枚举类型中列举出所有可能的取值,被说明为该枚举类型的变量的取值不能超过定义的范围。
    2. 枚举类型属于基本数据类型,而不是一种构造类型,因为它不能分解为任何基本数据类型。
    3. 定义:enum 枚举类型名{枚举值表};
        例如:enum pSex{Female,Male};
    4. 枚举变量定义:enum pSex p1,p2,p3;

二、typedef关键字
    1.定义: typedef 原类型名 新类型名;
       例如:给上面的枚举类型起个别名,type enum pSex PSEX;(为了与元类型区别,一般采用大写)
    2. 有时候宏定义可以完成typedef的功能,但是宏定义是由预处理完成的,而typedef是在编译时完成的,后者更为方便。

三、预处理指令
    1. 概念:以“#”开头的预处理命令。如包含命令#include,宏定义命令#define。
    2. C语言提供了多种预处理命令:宏定义,文件包含,条件编译等。

四、宏定义
    1. 概述:被定义为宏的标识符称为“宏名”。在编译预处理时,对程序中出现的所有的宏名,都用宏定义的字符串去替换,这称为宏代换或宏展开。
    2. 分类:有参数宏和无参数宏
    3. 无参数宏定义:#define 标识符 字符串。字符串可以是:常量,表达式,格式串
    4. 有参数宏定义:
         在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对于带参数的宏,在调用中,不仅要宏展开,而且要用实参去代替形参。
         #define 宏名(行参表) 字符串

例如:

#include <stdio.h>

#define M(x) x*x+x+2

void main()

{

int k = M(6); //k=6*6+6+2=44

printf("k = %d\n",k);

}

          有参宏使用注意事项:
             1)宏的形参之间可以出现空格,但是宏名和形参之间不能出现空格
             2)有参的参数最好用括号括起来。
             3)可以用宏来定义多个语句
    5. #define 和 typedef 
        宏定义只是简单的字符串代换,实在预处理时完成。
        typedef是在编译时完成的,它不是简单的代换,而是对类型说明符的重新定义。被命名的标识符具有类型定义说明的功能。
    6. 示例程序

#include <stdio.h>#define MAX(a,b) a>b ?a:b //宏定义三目运算,判断两数的大小void main(){int x,y;x=100;y=10;printf("%d\n",MAX(x,y)); //100}


五、条件编译
    1. 为什么要使用条件编译
       1)按不同的提交去编译不同的程序部分,因而产生不同的目标代码文件。有利于程序的移植和调试。
       2)条件编译可以条件语句来实现。但是条件语句会对整个源程序进行编译,生成的目标代码很长,而采用条件编译,则根据条件对其中的程序段1或者其它满足条件的程序段进行编译,生成的目标文件相对较短。
    2. #ifdef条件编译指令的一般形式
      #ifdef 标识符
                 程序段1
      #else
                程序段2
      #endif
    3. 示例程序
程序1:成绩等级判断

#include <stdio.h>#define score 60void main(){#if score < 60printf("E\n");#elif score < 70printf("D\n");#elif score < 80printf("C\n");#elif score < 90printf("B\n");#elseprintf("A\n");#endif}


程序2:错误调试

#include <stdio.h>#define DEBUG1 1#define DEBUG2 1void test1(){int a=0; #if DEBUG1 == 1 a=10; #else a=100; #endifprintf("a = %d\n",a);}void main(){void test1();test1();}


0 0