中国石油大学课件第11章预处理命令与程序组织1 第11章预处理命令与程序组织回顾文件的定义 FILE *fp; 文件的打开 fopen 文件的读和写 fscanf/fprintf 文件的关闭 fclose 教学目标编译预处理不带参数的宏定义带参数的宏定义编译预处理功能:一个源文件可将另一个源文件的内容全部包含进来一般形式: #include #include "文件名" 处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件做一个源文件编译。#include "" A B A 直接按标准目录搜索" " 先在当前目录搜索,再搜索标准目录可指定路径编译预处理被包含文件内容源文件*.c 头文件*.h 文件包含可嵌套宏定义数据结构定义函数说明等#include "" A C #include "" B A 不带参数的宏定义一般形式: #define 宏名[宏体] 功能:用指定标识符宏名代替字符序列宏体定义位置:任意一般在函数外面作用域:从定义命令到文件结束#define YES 1 #define NO 0 #define PI 3. #define OUT printf "Hello,World" ; 宏体可缺省,表示宏名定义过或取消宏体不带参数的宏定义#undef可终止宏名作用域: #undef 宏名#define YES 1 int main …….. #undef YES #define YES 0 void …….. YES原作用域 YES新作用域不带参数的宏展开宏展开:预编译时,用宏体替换宏名---不作语法检查引号中的内容与宏名相同也不置换如 if x YES printf "correct!\n" ; else if x NO printf "error!\n" ; 展开后: if x 1 printf "correct!\n" ; else if x 0 printf "error!\n" ; 例#define PI printf "2*PI %f\n",PI*2 ; 宏展开:printf "2*PI %f\n",*2 ; 不带参数的宏展开宏定义可嵌套,不能递归宏定义中使用必要的括号() #define +10 ? 例#define WIDTH 80 #define LENGTH WIDTH+40 var LENGTH*2; 宏展开:var 80+40 *2; 例#define WIDTH 80 #define LENGTH (WIDTH+40) var LENGTH*2; 宏展开:var (80+40) *2; 带参数的宏定义一般形式: #define 宏名参数表宏体宏展开:形参用实参换,其它字符保留宏体及各形参外一般应加括号() 不能加空格例#define S a,b a*b ……….. area S 3,2 ; 宏展开: area 3*2; 例#define S r PI*r*r 相当于定义了不带参宏S,代表字符串" r PI*r*r" 带参数的宏定义例#define POWER