枚举和预处理
// // main.c // 枚举和预处理 // // Created by qianfeng on 15/6/3. // Copyright (c) 2015年 qianfeng. All rights reserved. // #include <stdio.h> /* 枚举:用于声明一组常数 定义:enum 枚举名 {枚举元素1,枚举元素2,...} 注意 1、C语言会将枚举元素作为整型常量处理 2、默认第一个枚举元素是0,第二个是1,依次顺序加1 3、也可以在定义的时候改变枚举的值 enum Season{spring,summer,autumn=5,winter}; winter就是6 */ #if 0 int main(int argc, const char * argv[]) { //1、先定义枚举类型再定义枚举变量 enum Season{spring,summer,autumn,winter}; enum Season s; //2、定义枚举类型的同时定义枚举变量 enum Sesson2{Spring,Summer,Autumn,Winter} s2; //3、省略枚举名称,之间定义枚举变量 enum {a,b,c} ch; ch=a; //等价于ch=0; ch=2; //等价于ch=c; //遍历枚举元素 for(s=spring;s<Winter;s++){ printf("%d ",s); } return 0; } #endif /* 预处理 C语言编译之前,会对一些特殊的预处理指令作解释,产生一个新的源程序,再之后才是通常的编译 以#开头,并且结尾不用分号 预处理指令主要有:宏定义、条件编译、文件包含 作用范围:从定义的那一行开始到文件结束 例:#include <stdio.h> 宏定义 常用来定义常量 #define 宏名 字符串 #define PI 3.14 作用:在编译预处理时,将源程序所有宏名替换成后面的字符串 #undef 宏名 -->终止宏的作用域 宏定义与函数的区别 1、宏定义不涉及存储空间的分配、参数类型的匹配、返回值问题 2、函数调用在程序运行时执行,而宏替换只在编译预处理阶段进行,所有带参数的宏定义比函数具有更高的执行效率 */ #if 0 #define A 3.14 //#undef A //带参数的宏定义 #define average(a,b) (a+b)/2 // #define Pow(a) ((a) * (a)) int main(int argc, const char * argv[]) { printf("%f\n",A); int a=average(4,6); printf("平均值是:%d\n",a); int rst = Pow(10)/Pow(2); printf("%d\n",rst); return 0; } #endif /* 条件编译 一部分代码块满足一定条件才进行编译 #if 条件1 ...code1.... #elif 条件2 ...code2.... #else ...code3.... #endif */ #if 0 #define MAX 10 int main(int argc, const char * argv[]) { #if MAX==0 printf("MAX是0"); #elif MAX>0 printf("MAX大于0"); #else printf("MAX小于0"); #endif return 0; } #endif /* #if defined()和#if !defined() #if defined(宏名) //判断是否定义过宏,定义过就将code编译进去 ...code... #endif #ifdef和#ifndef用法跟if defined()和#if !defined()的用法基本一致,判断是否定义 #ifdef MAX ...code... #endif */ #if 0 typedef char * String;//给指针取别名 //定义结构体并取别名,struct后面的结构体名省略了,别名在后面Point typedef struct { float x; float y; }Point; typedef Point * PP;//起别名 enum Season {spring, summer, autumn, winter}; //给枚举取别名,使用时可以省前面的修饰enum typedef enum Season Season; int main(int argc, const char * argv[]) { String a = "1231231"; Point point = {10,20}; PP p = &point; //enum Season s = spring; Season s=spring; printf("spring=%d\n",s); printf("%f,%f\n",point.x,point.y); printf("%f,%f\n",p->x,p->y); printf("%s\n",a); #if defined(MAX) printf("定义过MAX宏定义\n"); #else printf("没定义过MAX宏定义\n"); #endif #ifdef MAX printf("定义过MAX宏定义"); #else printf("没定义过MAX宏定义\n"); #endif return 0; } #endif /* 文件包含 这个我们早接触过,就是#include,它可以将一个文件的全部内容拷贝到另一个文件中 #include <文件名> --->直接到C语言库函数头文件所在的目录中寻找文件 #include "文件名" --->用于自定义的头文件,查找顺序先在源程序的当前目录找 -->操作系统的path路径-->C语言库函数头文件所在的目录 注意 1、#include允许嵌套,不允许递归 2、使用#include指令可能导致多次包含同一头文件,降低编译效率 */