预处理命令
基本概念:ANSI C标准规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境,提高编程效率。
这些预处理命令是由ANSI C同一规定的,但是它们不是C语言本身的组成部分,不能直接对它们进行编译(因为编译程序不能识别它们)。必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行“预编译”
经过预处理后的程序可由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。
C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。
C提供的预处理功能主要有以下三种:
1、宏定义
2、文件包含
3、条件编译
这些功能分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C语言相区别,这些命令以符号“#”开头。例如:#define #include
1、宏定义
不带参数的宏定义
宏定义一般形式:
#define 标识符 字符串
#define PI 3.1415926
宏定义的作用时在本程序文件中使用指定的标识符PI来代替“3.1415926”这个字符串,在编译预处理时,将程序中在该命令以后出现的所有PI都用“3.1415926”代替。这种方法使用户能以一个简单的名字代替一个长的字符串。
这个标识符(名字)称为“宏名”
在预编译时将宏名替换成字符串的过程称为宏展开。#define是宏定义命令
说明:
(1)宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可用小写字母
(2)使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量
(3)宏定义时用宏名代替一个字符串,只做简单置换,不做正确性检查,只有在编译已被宏展开后的源程序时才会被发现语法错误并报错。
(4)宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换
(5)#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,#define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。
(6)可以用#undef命令终止宏定义的作用域
(7)在进行宏定义时,可以引用已定义的宏名,可以层层置换
例如:
1 #include<stdio.h> 2 #define R 3.0 3 #define PI 3.1415926 4 #define L 2*PI*R 5 #define S PI*R*R 6 void main() 7 { 8 printf("L = %f \n S = %f",L,S); 9 }
带参数的宏定义
作用:不是进行简单的字符串替换,还要进行参数替换
带参数的宏定义一般形式为:
#define 宏名(参数表) 字符串
字符串中包含在括弧中所指定的参数
如:#define S(a,b) a*b
2、文件包含处理
功能:一个源文件可以将另一个源文件的内容全部包含进来
一般形式:#include “文件名” // 先在当前目录搜索,在搜索标准目录
#include <文件名> //直接按标准目录搜索
处理过程:预编译时,用被包含文件的内容取代该预处理命令,再将“包含”后的文件作为一个源文件单位进行编译,得到目标文件.obj
被包含文件的内容:
源文件(*.c)
头文件(*.h)//宏定义,数据结构定义,函数说明等
文件包含可嵌套
预编译后成为一个文件,因此file2.c中的全局静态变量在file1.c中有效,不必在用extern声明
3、条件编译
概念:所谓“条件编译”,时对部分内容指定编译的条件,使其只在满足一定条件才进行编译
条件编译命令的几种形式:
(1)#ifdef 标识符 (2)#ifndef 标识符 (3)#if 表达式
程序段1 程序段1 程序段1
#else #esle #else
程序段2 程序段2 程序段2
#endif #endif #endif
原文地址:https://www.cnblogs.com/Long-w/p/8631138.html