C语言10--预处理指令,宏定义,条件编译,头文件

预处理指令

1.C语言源代码的编译过程
C编译器把源代码编译成可执行程序可分为以下步骤:
(1)预处理
处理代码中的预处理指令(以#开头的代码)
gcc -E xxx.c -o xxx.i

(2)编译
将源代码编译成汇编
gcc -S xxx.i -o xxx.s
gcc -S xxx.c -o xxx.s

(3)汇编
将汇编代码编译成目标文件(机器码)
gcc -c xxx.s -o xxx.o
gcc -c xxx.i -o xxx.o
gcc -c xxx.c -o xxx.o

(4)链接
将目标文件(可能有多个)链接成可执行程序
gcc xxx.o yyy.o… -o xxx
gcc xxx.c yyy.c… -o xxx

2.预处理指令的分类
可以分为三类:宏定义 条件编译 包含头文件

3.宏定义
#define 预处理指令可以定义宏,宏名应该大写
(1)宏可以给数字起名字
语法:
#define 宏名 数字

在代码中使用宏在预处理阶段将被替换成他所代表的内容
宏定义和const常量有相似之处
可以使用宏代表一个在编写程序时还不知道的数字或者以后可能变化的参数
注:可以定义一个宏不代表任何内容
1.宏名和后面代表的内容之间不要写"="
2.宏定义后面不要写分号

(2)宏可以给计算公式(代码)起名字
由于宏的处理是纯粹的字符替换,所以宏代表表达式时,应该加上括号
#define ADD (3+4)
#define SAY_HELLO printf(“hello everyone!\n”)//给一段代码起名

//使用宏表示多条语句的用法
#define INT_ME do{
printf(“Hi!\n”);
printf(“Byebye!\n”);
}while(0)

(3)带参宏(宏函数)
宏也可以有参数,这些参数用来表示计算公式/代码中未知的内容
带参宏的处理是通过二次替换完成,先将宏替换成带参表达式/语句,再将参数替换成传入的数据。
带参宏不但整个表达式要加括号,参数自己也要加括号
//宏定义
#define PI 3.14
//计算圆的面积
#define AREA® (PI*®*®)

带参宏和函数的区别:
1.函数中可以定义变量,带参宏不行
2.函数有返回值,带参宏只能将宏名当成计算公式的计算结果
3.函数的参数有类型,带参宏的参数无类型
4.计算/处理过程比较简单,不需要额外的存储空间可以使用带参宏
5.带参宏的参数不是变量,不能当左值

4.条件编译
使用预处理指令从源文件中挑选出希望被编译的语句,排除不想编译语句,这种效果就叫条件编译。
(1)#ifdef/ifndef … #else(可以没有) … #endif
以上的语句可以实现条件编译
根据某个宏是否被定义过从两组语句中选择一组来编译
其中#else可以省略
#ifdef 宏
…;//宏被定义语句被编译
#else//可选
…;
#endif

#ifndef 宏
…;//宏未被定义条件成立语句被编译
#else//可选
…;
#endif

(2)#if … #elif(多个) … #else(可以没有) … #endif
以上的语句也可以实现条件编译的效果
根据逻辑表达式的结果从多组语句中选择一组来进行编译
该逻辑表达式在预处理阶段能计算出结果(只能使用宏和数字)
逻辑表达式中可以使用所有的逻辑和关系操作符
#if 逻辑表达式1
…;
#elif 逻辑表达式2
…;
#else
…;
#endif

5.头文件
包含头文件的语法也属于预处理指令,作用就是将头文件中的内容拷贝到这条预处理指令位置。
#include -------------- 从系统指定位置查找头文件
#include “xxx.h” -------------- 从当前位置查找头文件

(1)多文件编程
C程序允许有多个.c的源代码,一个源文件中可以有多个函数,一个函数只能属于一个文件。编译多程序可以用gcc命令将所有的.c文件一起进行编译
gcc xxx.c yyy.c zzz.c… -o xxx

多文件编程中使用一个专门的文件(main.c)来包含主函数。其他函数放到其他文件中。
在多文件编程中,多个文件之间会有很多公共资源,为了避免这些公共资源重复编写和编译,C语言设计了头文件来记录这些公共资源。源文件只需要包含头文件即可。

那些是公共资源?需要写到头文件中
普通函数声明
全局变量的外部声明
宏定义
结构体 联合体 枚举的声明
其他头文件

头文件的语法:
#ifndef 宏名//宏名未被定义,以下内容就编译。否则不编译
#define 宏名

…//头文件的具体内容

#endif

头文件中宏名应该和头文件文件名一一对应
头文件中条件编译的语法确保了头文件的内容在整个程序中只被编译一次

编程时需要给每一个源文件(main.c除外)设计一个头文件,源文件对应的头文件名字和源文件相同(后缀不同,头文件的后缀是.h)
源文件需要包含的头文件:
1.配对的头文件
2.使用了该头文件中声明的公共资源(函数,变量,宏,…)

(2)extern
声明全局变量时加上extern关键字表示该声明语句不分配内存,仅仅表示这个变量存在,内存在其他文件中分配。
如果在一个.c文件中使用了另一个.c文件中声明的全局变量,使用前需要用extern关键字将该全局变量声明一次。外部声明是一定不要赋值

你可能感兴趣的:(C语言,c语言,linux)