编译预处理
本文将讲述C语言中关于预处理的相关知识。
预处理
在实际开发中,编译器在编译程序之前还需要对源文件进行简单的处理,这种简单加工过程称为 预处理 (即预先处理、提前处理)。
预处理主要是处理以#开头的命令,以#号开头的命令称为 预处理命令。预处理是C语言的一个重要功能,由预处理程序完成。当对一个源文件进行编译时,系统将自动调用预处理程序对源程序中的预处理部分做处理,处理完毕自动进入对源程序的编译。编译器会将预处理的结果保存到和源文件同名的.i文件中。
C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等,合理地使用它们会使编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。
文件包含命令(#include的用法)
#include叫做文件包含命令,用于引入对应头文件(.h文件)
#include就是将头文件的内容插入到该命令所在的位置,从而把头文件和当前源文件连成一个文件。
用法:
【列】 #include<stdHeader.h>
#include”myHeader.h”
尖括号与双引号的区别在于头文件的搜索路径不同:
●使用尖括号<>,编译器会到系统路径下查找头文件。
●使用双引号””,编译器首先在当前目录下查找头文件,如果没有找到,再到系统路径下查找。
【注意】
●一个#include命令只能包含一个头文件,多个头文件需要多个#include命令。
●文件包含允许嵌套,即一个被包含的文件中又可以包含另一个文件。
宏定义
不带参数的宏定义
1.定义形式: #define 宏名 替换文本 或 #define 宏名
2.说明:
●在define宏名和宏替换文本之间要用空格隔开
●可以用#undef命令终止宏定义的作用域
●在进行宏定义时,可以引用已定义的宏名
●同一个宏名不能重复定义
带参数的宏定义
宏定义还可进行参数替换。
●如果程序中带有实参的宏,则按#define命令行中指定的字符串从左到右进行替换。
●如果字符串中包含宏中的形参(如 x,y)则将程序语句中相应的实参(可以是常量、变量或表达式)代替形参。
●如果宏定义中的字符串中的字符不是参数字符(如 (x*
y)中的”*
“号),则保留。这样就形成了置换的字符串。
C语言带参宏定义和函数的区别
带参数的宏和函数很像,但本质上有区别:宏展开仅仅是字符串的替换,不会对表达式进行计算;宏在编译之前就被处理了,没有机会参与编译,也不会占用内存。而函数是一段可以重复使用的代码,会被编译,会分配内存,每一次调用函数就是执行这块内存中的代码。
C语言的预定义宏
预定义宏 即先定义好的宏,无需再定义即直接使用。ANSI C规定的几个预定义宏如下:_
LINE_
: 表示当前源代码的行号_
FILE_
: 表示当前源文件的名称_
DATE_
: 表示当前编译日期_
TIME_
: 表示当前编译时间
条件编译
条件编译:即能够根据不同情况编译不同代码,产生不同目标文件的机制。
#if的用法
一般格式:
1 |
|
意为:如常量 “表达式1”的值为真(非0),就对”程序段1”进行编译,否则就计算”表达式2”,结果为真(非0)就对”程序段2”进行编译,也为假,就继续往下匹配,直到遇到为真的表达式,或者最后到 #else。
#ifdef的用法
一般格式:
1 |
|
意为:如果当前的宏已被定义过,则对”程序段1”进行编译,否则对”程序段2”进行编译。
#ifndef的用法
一般格式:
1 |
|
意为:如果当前的宏未被定义过,则对”程序段1”进行编译,否则对”程序段2”进行编译。
版权声明
Scholar’s Blog by scholargeek is licensed under a Creative Commons BY-NC-ND 4.0 International License.
由董仕麟创作并维护的scholargeek博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证。
本文首发于Scholar’s Blog博客,版权所有,侵权必究。
本文永久链接:https://scholargeek.github.io/2018/02/16/C%E8%AF%AD%E8%A8%80%E5%AD%A6%E4%B9%A08/