枚举和预处理

//
//  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
",A);
    int a=average(4,6);
    printf("平均值是:%d
",a);
    int rst = Pow(10)/Pow(2);
    printf("%d
",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
",s);
    printf("%f,%f
",point.x,point.y);
    printf("%f,%f
",p->x,p->y);
    printf("%s
",a);
#if defined(MAX)
    printf("定义过MAX宏定义
");
#else
    printf("没定义过MAX宏定义
");
#endif
    
#ifdef MAX
    printf("定义过MAX宏定义");
#else
    printf("没定义过MAX宏定义
");
#endif
    return 0;
}
#endif


/*
 文件包含
 这个我们早接触过,就是#include,它可以将一个文件的全部内容拷贝到另一个文件中
 #include <文件名>  --->直接到C语言库函数头文件所在的目录中寻找文件
 #include "文件名"  --->用于自定义的头文件,查找顺序先在源程序的当前目录找 -->操作系统的path路径-->C语言库函数头文件所在的目录
 
 注意
 1、#include允许嵌套,不允许递归
 2、使用#include指令可能导致多次包含同一头文件,降低编译效率
*/
原文地址:https://www.cnblogs.com/0515offer/p/4581763.html