预处理与构造数据


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





posted @ 2015-06-19 16:09  天使雨儿  阅读(129)  评论(0编辑  收藏  举报