C语言预处理指令详解

什么是预处理指令?

介绍预处理指令之前,我们先来回顾一下C程序的编译过程,下图描述了C程序的编译过程。
图 3-3C程序编译过程
C程序编译过程分为四个阶段:第一阶段是预处理阶段;第二阶段是编译阶段;第三阶段是汇编阶段;第四阶段是链接阶段。执行这四个阶段的程序(预处理器、编译器、汇编器、和链接器)一起构成了C语言的编译系统。
预处理阶段主要用于处理源文件中的预处理指令,并根据指令对源代码进行修改和补充。例如:“#include”指令将头文件的内容补充到源文件内;“#define”指令用于宏定义,通过宏定义可以进行条件编译和内容替换,条件编译指令将决定那些代码被编译,而哪些是不被编译的。

文件包含指令

“#include”是C语言提供的包含文件的预处理指令,指令后面为要包含的文件名称,用来引入C语言的头文件。例如:
#include <stdio.h>

“stdio.h”文件在C语言中被称为头文件,该文件的扩展名为“.h”,“stdio.h”为C语言函数库的头文件,它定义了开发者可以使用的输入输出函数。文件名称使用一对英文尖括号将文件名称括起来,编译器会在系统路径下查找要包含的文件。开发者自己定义的头文件一般放置在项目目录下,这种情况下就不适合使用一对英文尖括号将文件名称括起来,而是使用一对英文双引号将文件名称括起来,编译器会在当前项目目录下查找要包含的头文件。例如:

#include "my.h"

一个 #include指令只能包含一个头文件,当一个C文件需要包含多个头文件时,需要使用多个#include指令。

例:#include练习
编写一个计算矩形面积的程序,要求计算矩形面积的函数声明放置在area.h头文件,函数定义放置在area.c文件,程序主文件为main.c。程序结构如下图所示。
程序清单 area.h
/*
函数功能:计算矩形面积
**/
int rect_area(int w,int h);
程序清单 area.c
/*
函数定义
**/
#include "area.h"  // 包含函数声明头文件
int rect_area(int w,int h) {
return w * h;
}
程序清单 main.c
#include <stdio.h>  //包含系统输入输出头文件
#include "area.h"   //包含计算面积函数头文件
int main() {
printf("area:%d\n",rect_area(30,20));
}

案例在area.h声明了rect_area函数,在 area.c定义了rect_area函数。把函数的声明和定义分开实现,可以将一组相关的函数和变量的声明集中在一个地方,以便在多个源文件中共享和重复使用。

宏定义

宏定义主要用于源代码代内的文本替换,它允许用一个标识符(和C语言语法的标识符有所不同,该标识符可以包含一些特殊符号)来表示一个字符串、表达式或数值, 该表示称为“宏”。被定义为“宏”的标识符称为“宏名”,对应的字符串、表达式或数值为宏定义的值。在C代码编译过程的预处理阶段,编译器会把源代码内的所有“宏名”替换为宏定义的值。使用宏定义可以提高程序的通用性、易读性,减少因为输入错误产生的各种问题,同时还便于修改。
更多C语言内容……
进入C语言入门课程