一、预处理指令的概念及分类
1.基本概念 以“#”号开头指令都称为【预处理指令】。如包含命令#include 等。在源程序中这些命令都放在函数之外。而且一般都放在源文件的前面,他们称为【预处理部分】
所谓预处理是指在进行编译的第一道扫描(词法扫描和语法扫描)之前所做的工作,预处理是C语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分做处理,处理完毕自动进入对源程序的编译。C语言提供了多种预处理功能。如宏定义,文件包含,条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。
二、宏的概念及无参宏定义方法 1.宏的概念 被定义为“宏”的标识符称为“宏名”,在编译预处理时,都用宏定义中的字符串取代换,这称为“宏代换”或“宏展开” 例如 #define Row 10 //此处Row就是一个宏
宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。在C语言中,“宏”分为【有参宏】和【无参宏】
无参宏的宏名不带参数,其定义一般形式为:
#define 标识符 字符串
其中"#" 表示这是一掉预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“标识符”位所定义的宏名。“字符串”可以使常熟,表达式、格式串等
例如: - //定义一个宏
- #define PI 3.1415926
- #define Area PI*4
- #include <stdio.h>
-
- int main(int argc, const char * argv[])
- {
-
- printf("area = %0.4f",Area);//预处理时,Area会被替换成3.1415926*4
- return 0;
- }
复制代码
打印结果
【注意】 1、宏定义式一个预处理指令,结尾不需要加“;” 2、宏定义替换问题 例如:
- //定义一个宏
- #define PI 3.1415926
- #define Sum a*b+2*b
- #include <stdio.h>
-
- int main(int argc, const char * argv[])
- {
-
- int a = 2,b =3;
-
- printf("a2*Sum+ 3*Sum = %0d\n",2*Sum+ Sum);//预处理时,2*Sum+ Sum会被替换成2*a*b+2*b+a*b+2*b = 30而不是2*(a*b+2*b) +(a*b+2*b) = 36.
- printf("2*a*b+2*b+a*b+2*b = %d\n", 2*a*b+2*b+a*b+2*b);
- printf("2*(a*b+2*b) +(a*b+2*b) = %d", 2*(a*b+2*b) +(a*b+2*b));
- return 0;
- }
复制代码
打印结果: a2*Sum+ 3*Sum = 30 2*a*b+2*b+a*b+2*b = 30
2*(a*b+2*b) +(a*b+2*b) = 36
|