一、枚举类型
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 60
void main(){
#if score < 60
printf("E\n");
#elif score < 70
printf("D\n");
#elif score < 80
printf("C\n");
#elif score < 90
printf("B\n");
#else
printf("A\n");
#endif
}
程序2:错误调试
#include <stdio.h>
#define DEBUG1 1
#define DEBUG2 1
void test1()
{
int a=0;
#if DEBUG1 == 1
a=10;
#else
a=100;
#endif
printf("a = %d\n",a);
}
void main(){
void test1();
test1();
}