《C/C 程序设计》第05章(编译预处理)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序段1 程序段1 # else 程序段2 程序段2 # endif
作用:当标识符已经被定义过(一般是用#define命令定义),则对程 命令定义), 作用:当标识符已经被定义过(一般是用#define命令定义),则对程
序段1进行编译,否则编译程序段2 其中#else部分可以没有, 序段1进行编译,否则编译程序段2。其中#else部分可以没有, #else部分可以没有 即: #ifdef 标识符 程序段1 程序段1 #endif [例] exifdef.c exifdef.
1.宏定义是用宏名代替一个字符串,只作简单的置换,不作语法检查。 宏定义是用宏名代替一个字符串,只作简单的置换,不作语法检查。 [例] extemp.c(预期结果 48,实际结果34) 2.在宏定义时,宏名与带参数的括弧之间不应加空格,否则将空格以后 在宏定义时,宏名与带参数的括弧之间不应加空格,
的字符都作为替代字符串的一部分。 的字符都作为替代字符串的一部分。
#define MAX 100 main() {printf("MAX=% n",MAX); {printf("MAX=%d\n",MAX); #define STRLEN MAX+1 MAX+1 printf("STRLEN=% n",STRLEN); printf("STRLEN=%d\n",STRLEN); #undef MAX #define MAX 200 printf("NEW MAX=%d\n",MAX); MAX=% n",MAX); printf("STRLEN=% n",STRLEN); printf("STRLEN=%d\n",STRLEN); }
程序段1 程序段1 # else 程序段2 程序段2 # endif
作用:当指定的表达式为真就编译程序段1,否则 作用:当指定的表达式为真就编译程序段1 就编译程序段2 就编译程序段2 [例 ] exiff.c 说明:表达式中应该为用#define定义的常量 定义的常量。 说明:表达式中应该为用#define定义的常量。
如: #define LONG_STRING “this is a very long string that is used as an examp减少程序中重复书 使用宏名代替一个字符串, 写某些字符串的工作量,简单,不易出错。 写某些字符串的工作量,简单,不易出错。当需要改变 可以只改变#define 命令行, 时,可以只改变#define 命令行,可以提高程序的可移 植性。 植性。 3.#define 命令出现在程序中函数的外面,宏名的有 命令出现在程序中函数的外面, 效范围为定义命令之后到本源文件结束, 效范围为定义命令之后到本源文件结束,可以用 #undef命令结束宏定义的作用域 #undef命令结束宏定义的作用域
5.1.2 带参数的宏定义
格式:# define 宏名(参数表) 字符串 宏名(参数表) 格式: 作用:按#define命令行中指定的字符串从左到右进行 作用: #define命令行中指定的字符串从左到右进行 置换,不仅进行简单的字符串替换,还要进行参数替换。 置换,不仅进行简单的字符串替换,还要进行参数替换。 说明: 说明:
5.2 文件包含处理
所谓“文件包含”处理是指一个源文件可以将另一个源文件的全部内 所谓“文件包含” 容包含进来,即将另外的文件包含到本文件中。 容包含进来,即将另外的文件包含到本文件中。通常可以把经常要使用的 带公用性的一批符号常数和带参数的宏定义行集中起来,做成一个文件, 带公用性的一批符号常数和带参数的宏定义行集中起来,做成一个文件, 然后再用文件包含将它们包含到需要的文件中来。 然后再用文件包含将它们包含到需要的文件中来。 形式: “文件名 文件名” 形式:# include “文件名” 可包含的文件有:系统的文件、用户自己的头文件、用户原文件。 可包含的文件有:系统的文件、用户自己的头文件、用户原文件。 说明: 一个include命令只能指定一个被包含文件 如果要包含m 命令只能指定一个被包含文件, 说明:1. 一个include命令只能指定一个被包含文件,如果要包含m个 文件,则要用m 命令。 文件,则要用m个include 命令。 2.如果文件1包含文件2,而文件2中要用到文件3的内容,则可 如果文件1包含文件2 而文件2中要用到文件3的内容, 在文件1中用两个include 命令分别包含文件2和文件3 在文件1中用两个include 命令分别包含文件2和文件3,而且 文件3应出现在文件2之前。这样,file1 file2都可以用file3 文件3应出现在文件2之前。这样,file1和file2都可以用file3 的内容, file2中不必再用#include “file3 h”了 的内容,在file2中不必再用#include “file3.h”了。
形式2 形式2:# ifndef 标识符
程序段1 程序段1 # else 程序段2 程序段2 # endif
作用:当标识符未被定义过时,则对程序段1 作用:当标识符未被定义过时,则对程序段1进行 编译,否则编译程序段2 编译,否则编译程序段2。 [例] exifndef.c 形式 3:# if 表达式
(3)对函数中的实参和形参都要定义类型,二者的类型要求一致。而宏 对函数中的实参和形参都要定义类型,二者的类型要求一致。 不存在类型的问题,宏名无类型,它的参数也无类型。宏定义时,字符串 不存在类型的问题,宏名无类型,它的参数也无类型。宏定义时, 可以是任何类型的数据。 可以是任何类型的数据。 (4)调用函数只可得到一个返回值,而用宏可以设法得到几个结果 调用函数只可得到一个返回值,
44调用函数只可得到一个返回值而用宏可以设法得到几个结果调用函数只可得到一个返回值而用宏可以设法得到几个结果5252文件包含处理文件包含处理所谓文件包含处理是指一个源文件可以将另一个源文件的全部内所谓文件包含处理是指一个源文件可以将另一个源文件的全部内容包含进来即将另外的文件包含到本文件中
C提供的预处理功能主要有以下几种: 提供的预处理功能主要有以下几种: 1.宏定义 1.宏定义 2.文件包含 2.文件包含 3.条件编译 3.条件编译 编译预处理行均以“#”开头 编译预处理行均以“#”开头
5.1 宏定义 (带有参数的宏定义、不带参数的宏定义) 带有参数的宏定义、不带参数的宏定义) 5.1.1 不带参数的宏定义
形式:# define 标识符 字符串 形式: 作用: 作用:用一个指定的标识符来代表一个字符串 [例] 求圆的面积。(excare.c) 求圆的面积。( 。(excare.c) 说明: 每条预处理指令必须独占一行。 说明:1每条预处理指令必须独占一行。 如果串长于一行,可在行尾用反斜线“ 续行。 如果串长于一行,可在行尾用反斜线“\”续行。 行末不必加分号。 行末不必加分号。
5.3 条件编译
一般情况下,源程序中所有行都要参加编译。但有时希 一般情况下,源程序中所有行都要参加编译。 望有选择地编译程序的不同部分,这就是条件编译。 望有选择地编译程序的不同部分,这就是条件编译。C语言 提供的条件编译能力, 提供的条件编译能力,它能使同一个源程序在不同的编译条 件下,产生出不同的目标代码文件。 件下,产生出不同的目标代码文件。 形式1 形式1: # ifdef 标识符
3.文件包含是可以嵌套的。如下图所示: 3.文件包含是可以嵌套的。如下图所示: 文件包含是可以嵌套的 file1.c # include “file2.h” …... file2.h # include “file3.h” …... file3.h 不含# include 命令 …...
4.在#include命令中,文件名可以用双引号或尖括号括起来 4.在#include命令中, 命令中 例:# include “file1.h” 或 # include <file2.h> 区别为:对于前者, 区别为:对于前者,系统先在当前目录中寻找要包含的文 若找不到,再按系统指定的标准方式检索其它目录。 件,若找不到,再按系统指定的标准方式检索其它目录。而 对于后者,直接按系统标准方式检索文件目录,不检查源文 对于后者,直接按系统标准方式检索文件目录, file1.c所在的文件目录 所在的文件目录。 件file1.c所在的文件目录。
# define S ( r ) PI*r*r 则认为符号常量S代表字符串“(r) PI*r*r” 代表字符串“ 3.函数与带参数的宏定义的主要区别: 函数与带参数的宏定义的主要区别: (1)函数调用时,先求出实参表达式的值,然后代入形参。而使用带 函数调用时,先求出实参表达式的值,然后代入形参。
参数的宏只是进行简单的字符替换。 参数的宏只是进行简单的字符替换。 (2)函数调用是在程序运行时处理的,分配临时的内存单元。而宏展 函数调用是在程序运行时处理的,分配临时的内存单元。 开是在编译时进行的,在展开时并不分配内存单元,不进行值的传递功 开是在编译时进行的,在展开时并不分配内存单元, 能,也没有“返回值”的概念。 也没有“返回值”的概念。
相关文档
最新文档