C语言——编译预处理
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
C语言——编译预处理
什么是编译预处理
C语言由源代码生成可执行程序的过程如下
- C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件
其中编译预处理阶段读取C源程序对其中的预处理指令以#开头的指令和特殊符号进行处理。或者说是扫描源代码对其进行初步的转换产生新的源代码提供给编译器。
预处理指令主要包括包含文件、宏定义指令、条件编译
包含文件
#include所包含的文件其扩展名可以是“.c”,表示包含普通C语言源程序。也可以是 “.h”,表示C语言程序的头文件。C语言系统中大量的定义与声明是以头文件形式提供的。
#include <.h>
编译程序将到C语言开发环境中设置好的 include文件中去找指定的文件所以一般对标准头文件采用尖括号
#include ".h"
对编程自己编写的文件则使用双引号。
宏定义
Object-like宏
- 可以比较简单的进行代码段的替换。这种方式最常用做表示常量数字。
# define MAXSIZE 100 //使用宏的时候就能用MAXSIZE代替100了
好处比起直接使用常数能够提高代码效率
Function-like宏
- 使用该宏的时候类似于调用函数这类宏的定义中宏的名称后面紧跟一堆括号(与括号之间不能有空格)。
- 调用该类宏的时候也必须跟一个括号如果不跟括号的话会显示语法错误。
#define lang_init() c_init()
lang_init()//相当于引用它→ c_init()
条件编译
常用的条件编译指令
条件编译指令 | 说 明 |
---|---|
#if | 如果条件为真则执行相应操作 |
#elif | 如果前面条件为假而该条件为真则执行相应操作 |
#else | 如果前面条件均为假则执行相应操作 |
#endif | 结束相应的条件编译指令 |
#ifdef | 如果该宏已定义则执行相应操作 |
#ifndef | 如果该宏没有定义则执行相应操作 |
- 满足条件则编译
- 注意必须使用 #endif 结束该条件编译指令。
防止头文件重复包含
#ifndef _HEADNAME_H_
#define _HEADNAME_H_
...
#endif
- 第一次包含头文件的时候由于
_HEADNAME_H_
还没定义所以会定义这个宏定义并且头文件内容参与编译 - 如果头文件重复包含的时候由于
_HEADNAME_H_
这个宏定义已经被定义了所以以下内容就不参加编译