预处理与构造数据
knowledge can grow with given
一、预处理(预编译)
定义:在编译之前对程序进行的处理
预编译 编译 汇编 链接
*.c ——> *.i —> *.S —> *.o —> elf
MOV R1, R2 —> 1010 0001 0010
包含:头文件包含、宏定义、条件编译
二、头文件包含
作用:将很多个编译单元共用的内容存放到一个文件中, 谁用谁包含该文件,避免了大量的重复书写。
主要包含:函数声明、宏定义、结构体定义
处理方式:完全展开,若头文件中包含其他头文件,
会递归展开
#include <xx.h>:
去系统默认目录查找
#include “xx.h”:
先在当前目录查找,找不到再去系统默认目录查找
头文件不能重复包含,会造成重复定义;
但是使用以下方式可以避免此问题。
#ifndef _STDIO_H_
#define _STDIO_H_
#endif /* _STDIO_H_ */
三、宏定义
定义:用简单易记的名字代表特定的内容
例子:#define PI 3.14159
处理方式:简单地替换
优点:增强代码的可读性,书写简单
带参宏:不等价于函数
1、若整个式子有返回值,需要添加括号
2、参与运算的参数需要添加括号
四、条件编译
定义:给某段代码指定编译条件
处理方式:参与或不参与编译
格式一:
#if 表达式
#endif
#ifdef 宏
#endif
#ifndef 宏
#endif
格式二:
#if 表达式
#else
#endif
说明:没有明确地分文件规定,一般按照功能模块
五、结构体
定义:由多种数据类型的变量结合在一起的结构
关键字:struct
格式:
typedef struct book {
char name[20];
char author[200];
float price;
}BOOK;
变量定义:BOOK book1;
成员变量:
变量名.成员名
指针名->成员名
结构体可以整体赋值,作为函数参数传递时,传递的是值
大小:每个成员都有自己的存储空间,但并不是简单的相 加,还与数据的存储对齐有关.
结构体定义:可以包含其它类型的结构体变量, 但是不能包含自身结构体变量;
可以包含指向自身类型的指针变量
六、联合体
定义:多个变量占用同一内存空间的结构,叫共用体
关键字:union
特点:
1、大小等于占用存储空间最大成员的大小
2、某一时刻只能一个成员有效
七、枚举
定义:将变量的可能取值一一列举出来,
变量的值只能在列举的范围内取值。
有人也把枚举称为一堆宏的集合
关键字:enum
特点:枚举值默认是从0开始的连续整数,依次递增;
在声明枚举类型时可以指定枚举值,
指定后的枚举值依次递增。
优点:提高代码的可读性
程序中的可见常数称为幻数,应尽量少用
练习:
1、编写一个简易的字典,实现查找功能,字典的单词和释义保存在一个字符指针数组中,格式:
char *dic[] = {
“apple:🍎”,
“banana:🍌”,
};
要求:声明放在头文件中,实现放在不同的C文件中,其中字符串操作放在strop.c中,排序函数放在sort.c中,这两个文件都有各自的头文件。
2、设置某个数据的某一位(0/1 —> 1)
3、清除某个数据的某一位(0/1 —> 0)
4、取反某个数据的某一位(0–>1、1–>0)
5、打印一个数的二进制版本,如:250,打印:11111010
a & (1<<i)==0 a的第i位为0