9-预处理命令.ppt
文本预览下载声明
第9章预处理命令 1-宏定义 2- “文件包含”处理 3-条件编译 从内容来看,C语言源程序由两部分构成: 一部分是C语言的各种语句,包括变量定义、函数声明、函数调用等等; 另一部分则是预处理命令。 预处理,顾名思义,就是在源程序正式编译之前要处理的一些命令。 C的预编译处理程序首先读入程序员写的源程序,经过预处理后形成新的源程序,然后再将这个新形成的源程序输入给C的编译器进行编译。 为了与一般的C语句相区别,C语言的预处理命令都以“#”号开头。 1- 宏定义 由于预编译器处理宏时,并不对宏的内容文本进行任何处理,仅仅是一个文本替换操作,因此,程序员在定义宏时,如果宏是一个表达式,一定要将这个表达式用()括起来,否则可能会引起非预期的结果。例如,下表左边的程序在定义宏时,没有将宏表达式括起来: P193 例9.5 由于带参宏在使用时,参数大多是表达式,宏内容本身也是表达式,因此,不但需要将宏参数用()括起来,而且还要将整个宏内容括起来。否则可能引起非预期结果。例如,下面的程序中,MULTI宏的参数没有括起来: 2- “文件包含”处理 例如,如果有文件a.h,它的内容如下: 源程序文件a.c用#include命令包含了a.h文件 条件编译命令大致有3种: 1、#if 条件1 源程序段1 #else 源程序段2 #endif 其中, 当某个条件被满足时,这个条件下面的源程序段是有效的,否则无效。 每个条件必须是一个常量表达式,通常会用到宏名。 命令都独占一行。 2、#ifdef 宏名1 源程序段1 #else 源程序段2 #endif 其中, #endif不能没有,它是#ifdef命令的结尾。 “#ifdef 宏名”的含义是判断是否定义了宏,它等价于#if defined(宏名) 3、#ifndef 宏名 源程序段1 #else 源程序段2 #endif 其中, #else可以没有,但#endif不能没有,它是#ifndef命令的结尾。 本章作业 9.1 9.3 9.5 * 不带参数的宏替换 1、形式: #define 宏名 字符串/宏体 其中:①、#define是宏定义命令; ②、宏名为C语言标识符,它是所定义的符号常量的名字; ③、字符串形式的常量表达式可以包含任意字符。 2、功能:将程序中所有出现的宏名用宏体替换 (通常用于定义符号常量) 3、例: #define PI 3.1415926 #define LETTER abcdefg 程序员输入的源程序 #define NUM1 2 #define NUM2 5 #define BASE NUM1+NUM2 main() { int a=3,b=3; a=a*BASE; b=b*BASE; printf(a=%d,b=%d\n,a,b); } 预编译器处理后的新源程序 main() { int a=3,b=3; a=a*2+5; b=b*2+5; printf(a=%d,b=%d\n,a,b); } 如果将BASE的定义改成下面的定义,就可以避免上述错误了: #define BASE (NUM1+NUM2) 4、说明: ①、宏名一般习惯用大写字母表示,以示与变量名相区别; ②、宏定义不是C语句,不必加分号,否则连分号一起替换; #define PI 3.1415926; area=PI*r*r; area=3.1415926;*r*r; ③、#define命令一般写在程序开头,但也可以在其它位置; ④、可以用#undef命令终止宏定义的作用域; #define G 9.8 …… #undef ⑤、宏定义中还可以引用已定义的宏名: #define R 3.0 #define PI 3.1415926 #define L 2.0*PI*R #define S PI*R*R ⑥、对于双引号括起来的字符串内的字符,即使与宏名相同也不进行替换; printf(“L=%f\n”, L); printf(“L=%f\n”, 2.0*PI*R); ⑦、宏定义是专门用于预处理命令的一个专用名词,与定义变量的含义不同,只做字符替换,不分配内存空间。 #define SMALLSIZE 512 #define LARGESIZE (512+200) main() { int a; scanf(%d,a); if(aSMALLSIZE) printf(small\n); else if (a=LARGESIZE*2) printf(medium\n); else printf(too large\
显示全部