C语言 枚举类型和预处理指令
2019-06-25 本文已影响0人
一直很安静_25ae
枚举的定义
enum Season
{
spring ,
summer,
autumn,
winter
};
// 2.定义枚举变量
enum Season s = spring;
预处理指令
- 所有的预处理指令都是以#开头
- 预处理指令分为三种
- 宏定义
- 条件编译
- 文件包含
- 预处理指令在代码翻译成0根1之前执行
- 预处理的位置是随便写的
- 预处理的作用域:从编写指令的那一行开始,一直到文件结尾,可以用#undef取消宏定义的作用
- 宏定义一般用大写或K开头,变量名一般用小写
宏定义
- 不带参数的宏定义
#define COUNT 4
int ages[COUNT] = {1, 2, 67, 89};
for ( int i = 0; i<COUNT; i++) {
printf("%d\n", ages[i]);
}
- 带参数的宏定义(效率比函数高)
//函数求和
int sum(int a, int b)
{
return a + b;
}
int main()
{
int a = 10;
int b = 20;
int c = sum(a, b);
}
//宏定义求和
#define sum(v1, v2) ((v1)+(v2))
int main()
{
int a = 10;
int b = 20;
int c = sum(a, b);
}
注意带参数的宏定义中每一个参数都需要加括号();
#define pingfang(a) ((a)*(a))
int main()
{
int c = pingfang(5+5);//(5+5)*(5+5) =100
}
条件编译
条件编译跟if else差不多
//if-else语句
int main()
{
int a = 10;
if (a == 10)
{
printf("a是10\n");
}
else if (a == 5)
{
printf("a是5\n");
}
else
{
printf("a其他值\n");
}
}
//条件编译
// 只要写了#if,在最后面必须加上#endif
#define A 5
int main()
{
#if (A == 10) //因为是预处理指令,所以此处的A也需要提前编译的,所以A需要写成宏
printf("a是10\n");
#elif (A == 5)
printf("a是5\n");
#else
printf("a其他值\n");
#endif
}
//条件编译的其他用法
#define A 5
//第一种
#if defined(A) //注意括号里面的A是一个预处理的宏
printf("哈哈\n");
#endif
//第二种
#if !defined(A) //注意括号里面的A是一个预处理的宏,defined前面的!表示取反
printf("哈哈\n");
#endif
//第三种,取代上面的两种方法
#ifdef A
printf("哈哈\n");
#endif
#ifndef A
printf("哈哈\n");
#endif
include
//李四的.c工程
int sum(int a, int b)
{
return a + b;
}
//李四的.h文件
#ifndef LISI_H //自定义的宏一般为文件名的大写 ,这三行的作用主要是为了防止被重复引用
#define LISI_H
int sum(int a, int b);
#endif
//张三想用李四的函数,张三的.c文件
/*
1.<>表示系统自带的文件,""表示自定义的文件
2.不允许循环包含,比如a.h包含b.h,b.h又包含a.h
*/
#include "lisi.h"
#include <stdio.h>
int main()
{
int c = sum(10, 19);
printf("c is %d\n", c);
return 0;
}
typedef
- 作用:给已经存在的类型起一个新的名称
- 使用场合:
1> 基本数据类型
2> 指针
3> 结构体
4> 枚举
5> 指向函数的指针
- 整型的重定义
typedef int MyInt;
int main()
{
MyInt i = 10;
}
typedef int MyInt;
typedef MyInt MyInt2; //可以为重命名的类型继续重命名
int main()
{
MyInt i = 10;
MyInt2 c = 20;
}
- 指针类型的typedef
// 给指针类型char *起一个新的类型名称String
typedef char * String;
int main()
{
String name = "jack";
}
- 结构体类型的typedef
//第一种
struct Student
{
int age;
};
typedef struct Student MyStu;
int main()
{
MyStu stu = {10};
}
//第二种
typedef struct Student
{
int age;
} MyStu;
int main()
{
MyStu stu = {10};
}
//第三种方式,直接省掉名字
typedef struct
{
int age;
} MyStu;
int main()
{
MyStu stu = {10};
}
- 枚举类型的typedef
//第一种
enum Sex
{
Man,
Woman
};
typedef enum Sex MySex;
int main()
{
MySex s = Man;
}
//第二种
typedef enum {
Man,
Woman
} MySex;
int main()
{
MySex s = Man;
}
- 指向函数的指针
typedef int (*MyPoint)(int, int);
int sum(int a, int b)
{
return a + b;
}
int main()
{
MyPoint p = sum;
}
define和typedef的区别
#define Integer int //没有;分号 把后面的数据类型定义成前面这种方式
typedef int Integer; //后面有分号,把前面这种数据类型重新命名成后面的数据类型