看到unix网络编程第七章时,忽然想总结一下C语言的预处理器的有关知识了。
1.预处理器的功能
在真正开始编译之前C预处理器会对源文件进行预处理,也叫做预编译,主要有三个功能。
(1)将源文件中以”include”格式包含的文件的内容复制到预编译的源文件中。
(2)用实际值替换用“#define”定义的符号(即进行宏替换)。
(3)根据“#if”后面的条件决定需要编译的代码。
以#开头的命令行(#前可以有空格)就是预处理器处理的对象。他们可以出现在任何地方,预处理的过程分为几个阶段:
首先将三字符序列替换为等价字符,其次将指令行中位于换行符之前的反斜杠删除掉,以把个指令行连接起来,将程序分成用空白符分割的记号(注释将被替换为一个空白符),接着执行预处理指令,并进行宏扩展。之后将转义字符替换成等价的字符,把相邻的字符串字面值连接起来,搜集必要的程序和数据。
2. 行链接
用反斜杠\进行连接
3. 宏定义和扩展
宏定义指令:#define 标识符 记号序列
#undef 标识符:用于取消标识符的预处理器定义。将其应用于未知标识符(没有用#define定
义的标识符)并不会出错。
文件包含指令:#include <文件名>
条件编译指令:每个条件编译指令都要占一行,条件编译指令有:
#if 常量表达式 #ifdef 标识符 #ifndef 标识符 #elif 常量表达式 #else
#ifdef 标识符 等价于 #if defined 标识符 #ifndef 标识符 等价于 #if ! defined 标识符
其他的不常用的预处理指令:
#line #error #pragma
#line指令的使用:
这个宏通常是和__LINE__宏一起使用的,__LINE__宏表示当前c语句在源文件中的行数,以前也只是在书上看到过,写过一些实例小程序,实际应用中并无使用。
两个头文件的内容:
study.h
#include "study1.h"
char * study(int,int);
study1.h
int study1(int,int);
hong.c
#include "study.h"
/*good good good*/
int study1(int a,int b)
{ return a+b; }
预处理结果:可以看到预处理结果把注释去掉了,而且把两个头文件的内容拷贝了过来。
# 1 "hong.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "hong.c"
# 1 "study.h" 1
# 1 "study1.h" 1
int study1(int,int);
# 2 "study.h" 2
char * study(int,int);
# 3 "hong.c" 2
int study1(int a,int b)
{ return a+b; }