系列文章目录
文章目录
- 前言
- 一、预处理指令
- 1. #line的用法
- 1.1 概述
- 2. #error
- 2.1 概述
- 二、预定义宏
- 三、示例
- 1. #line
- 2. #error
- 3. 预定义宏
- 总结
前言
C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器(C Preprocessor)简写为 CPP。
一、预处理指令
所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始。下面列出了所有重要的预处理器指令:
指令 | 描述 |
---|---|
#define | 定义宏 |
#include | 包含一个源代码文件 |
#undef | 取消已定义的宏 |
#ifdef | 如果宏已经定义,则返回真 |
#ifndef | 如果宏没有定义,则返回真 |
#if | 如果给定条件为真,则编译下面代码 |
#else | #if 的替代方案 |
#elif | 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码 |
#endif | 结束一个 #if……#else 条件编译块 |
#error | 当遇到标准错误时,输出错误消息 |
#pragma | 使用标准化方法,向编译器发布特殊的命令到编译器中 |
1. #line的用法
1.1 概述
(1)#line 用于强制指定新的行号和编译文件名,并对源程序的代码重新编号
(2)用法:#line number newFilename //newFilename 可省略
(3)#line 编译指示字的本质是重定义__LINE__和__FILE__
2. #error
2.1 概述
(1)#error 是一种预编译器指示字,用于生成一个编译错误消息 。
(2)用法:#error [message] //message为用户自定义的错误提示信息,可缺省。
(3)#error 编译指示字用于自定义程序员特有的编译错误消息。类似的,#warning 用于生成编译警告消息。
(4)#error 可用于提示编译条件是否满足。编译过程中的任何错误意味着无法生成最终的可执行程序。
二、预定义宏
宏 | 描述 |
---|---|
__DATE__ | 当前日期,一个以 “MMM DD YYYY” 格式表示的字符常量。 |
__TIME__ | 当前时间,一个以 “HH:MM:SS” 格式表示的字符常量。 |
__FILE__ | 这会包含当前文件名,一个字符串常量。 |
__LINE__ | 这会包含当前行号,一个十进制常量。 |
__STDC__ | 当编译器以 ANSI 标准编译时,则定义为 1。 |
三、示例
1. #line
示例1:
#include <stdio.h>
//作者 A 写的代码
//--------------------------开始--------------------------
//把 line 的下一行定义为第 1 行,文件名为“a.c”
#line 1 "a.c"
//--------------------------结束--------------------------
//作者 B 写的代码
//--------------------------开始--------------------------
//把 line 的下一行定义为第 1 行,文件名为“b.c”
#line 1 "b.c"
//--------------------------结束--------------------------
//作者 C 写的代码
//--------------------------开始--------------------------
#line 1 "MyCode.c"
int main(){printf("%s:%d\n",__FILE__,__LINE__);#line 1 "Test.c"printf("%s:%d\n",__FILE__,__LINE__);return 0;
}
//--------------------------结束--------------------------
运行结果:
2. #error
示例1:
#ifndef UNIX
#error This software requires the UNIX OS.
#endif
运行结果:
示例2:
#define SIZE 10
#if SIZE < 0 || SIZE > 100
#error SIZE must be between 1 and 100.
#endif
运行结果:
3. 预定义宏
示例1:
printf("File :%s\n", __FILE__ );
printf("Date :%s\n", __DATE__ );
printf("Time :%s\n", __TIME__ );
printf("Line :%d\n", __LINE__ );
printf("ANSI :%d\n", __STDC__ );
运行结果: