C语言基础专题 - 预处理
1.🧐什么是预处理?
预处理是由预处理器在编译前对代码进行的文本替换。这意味着替换前的代码文本是可读性更高、写起来更方便的。
这里需要指出:
预处理器不是编译器的一部分,而是仅仅一个依据预定义规则进行文本替换的独立的代码文本替换工具。
请看这样一段代码:
/* 返回x^2 */ int square(int x) { return x * x; }
上面我们定义了一个函数int square(int x)
,调用时我们用square(x)
,因而相同功能也可以用宏替换指令#define
来现实:
#define square(x) ((x) * (x)) // 预处理指令`#define`用于将前者替换为后者
更常见的,我们学习C语言的入门代码Hello World.c
中的第一行代码#include <stdio.h>
就属于预处理指定,这条指令声明在这个地方插入别的文件中的代码,也就意味着在实际编译的时候,该指定会被替换成被插入的代码进行执行。
2.常用的预处理指令
指令 | 说明 |
#include |
包含一个源代码文件 |
#define A B |
宏定义,用于实现将A宏替换为B |
#undef |
取消已定义的宏 |
#ifdef |
如果宏已经定义,则返回真 |
#ifndef |
如果宏没有定义,则返回真 |
#if |
如果给定条件为真,则编译下面代码 |
#else |
#if 的替代方案 |
#elif |
如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码 |
#endif |
结束一个 #if……#else 条件编译块 |
#error |
当遇到标准错误时,输出错误消息 |
#pragma |
使用标准化方法,向编译器发布特殊的命令到编译器中 |
3.预定义的宏
这里我们先来解释一下宏的概念:
在计算机编程中,所谓宏,指的是根据一系列预定义的规则替换一定的文本模式。实际上也就是预处理的一种方法。在C语言中,使用
#define
指令来定义宏,其用法和案例上面已经介绍过了,这里不再复述。
以下是系统预定义的宏,在编程时可以直接使用它们:
宏 | 说明 |
__DATE__ |
当前日期,一个以 “MMM DD YYYY” 格式表示的字符常量。 |
__TIME__ |
当前时间,一个以 “HH:MM:SS” 格式表示的字符常量。 |
__FILE__ |
这会包含当前文件名,一个字符串常量。 |
__LINE__ |
这会包含当前行号,一个十进制常量。 |
__STDC__ |
当编译器以 ANSI 标准编译时,则定义为 1。 |