枚举和预处理

//

//  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指令可能导致多次包含同一头文件,降低编译效率

*/

 

你可能感兴趣的:(枚举)