编译预处理

  通常在C编译系统对程序进行编译前,先对程序中一些特殊的命令进行”预处理”,然后将预处理的结果和源程序一起进行编译处理,得到目标代码。

1.宏定义

  宏(Macro),是一种批量处理的称谓。计算机科学里的宏是一种抽象(Abstraction),它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器。宏这一术语也常常被用于许多类似的环境中,它们是源自宏展开的概念,这包括键盘宏和宏语言。绝大多数情况下,“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。[百度百科]

(1)不带参数的宏定义
用一个指定的标识(即名字)来代替一个字符串,它的一般形式如下

#define 标识符 字符串

#define PI 3.1415926

指定用标识符PI来代替字符串3.1415926,以后程序中出现PI,则它表示”3.1415926”。
这里需要注意几点:
1. 宏定义一般用大写字母表示,便于与变量名相区别。
2. 宏定义不是C语言,所以结尾不必加分号。
3. 通常#define命令写在文件开头,位于函数之前,作为文件的一部分,在此文件范围内有作用。
4. 对程序中用双引号括起来的字符串的字符,即使与宏名相同,也不作替换。
5. 进行宏定义时,可以引用已定义的宏名,可以层层置换。

(2)带参数的宏定义
除了进行简单的字符替换外,还要进行参数替换,它的一般形式如下:

#define 宏名(参数) 字符串

#define add(x,y) x+y
z = add(7,8); //此句在函数内部

带有参数的宏与函数非常类似,在引用函数时也是在函数名后的括号内写实参,且要求实参是数目等于形参。但是它们还是有区别的。
1. 对参数的使用方法不一样。函数调用时,先求出实参表达式的值,然后带入形参。宏只是进行简单的字符替换。
2. 处理机制不一样。函数调用在程序运行处理,且要分配空间;宏定义在编译时进行,不分配内存空间,不发送值的传递处理,也不存在返回值。
3. 定义时要求不一样。函数定义时,实参和形参都要定义类型;宏定义时不存在类型问题。
(3)代码示例

/*输入一个圆的半径,求它的面积*/
#include 
#define PI 3.1415926
#define area(r) PI*r*r
int main() {
  float r,a;
  scanf("%f",&r);
  a = area(r);
  printf("The area is %f",a);
  return 0;
}

2.文件包含语句

在文件包含语句中,一个源文件可以将另一个源文件全部内容包含进来,其一般形式如下

#include <文件名>

#include 

这时被包含的文件stdio.h与其所在的文件在编译之后组成一个文件。对被包含的文件的修改将影响到其所在的文件。

你可能感兴趣的:(C语言)