C中的预处理命令[借鉴].pdfVIP

  • 1
  • 0
  • 约8.69千字
  • 约 6页
  • 2021-10-13 发布于福建
  • 举报
C 中的预处理命令是由 ANSIC 统一规定的, 但它不是 C 语言的本身组成部分, 不能直接对它们进行编译, 因为编译程序无法识别它们。必须对程序进行通常的编译(包括词法和语法分析,代码生成,优化等)之 前,先对程序中这些特殊的命令进行 预处理“ ”,例如:如果程序中用 #include 命令包含一个文件 “stdio.h ,” 则在预处理时, 将 stdio.h 文件中的实际内容代替该命令。 经过预处理后的程序就像没有使用预处理的程序 一样干净了,然后再由编译程序对它进行编译处理,得到可供执行的目标代码。现在的编译系统都包括了 预处理,编译和连接部分,在进行编译时一气呵成。我们要记住的是预处理命令不是 C 语言的一部分,它 是在程序编译前由预处理程序完成的。 C 提供的预处理功能主要有三种:宏定义,文件包含,条件编译。它们的命令都以 “#开头。” 一 , 宏定义 :用一个指定的标识符来代表一个字符串,它的一般形式为: #define 标识符 字符串 #define PI 3.1415926 我们把标识符称为 宏名“ ”,在预编译时将宏名替换成字符串的过程称为 宏展开“ ”,而#define 是宏定义命令。 几个应该注意的问题: 1, 是用宏名代替一个字符串,也就是做简单的置换,不做正确性检查,如把上面例子中的 1 写为小写字 母 l ,预编译程序是不会报错的,只有在正式编译是才显示出来。 2 , 宏定义不是 C 语句,不必在行未加分号,如果加了分号则会连分号一起置换。 3 , #define 语句出现在程序中函数的外面, 宏名的有效范围为定义命令之后到本源文件结束, 通常 #define 命令写在文件开头,函数之前,作为文件的一部分,在此文件范围内有效。 4 , 可以用 #undef 命令终止宏定义的作用域。如: #define PI 3.1415926 main(){ } #undef PI mysub(){ } 则在 mysub 中 PI 不代表 3.1415926 。 5 , 在进行宏定义时,可以引用已定义的宏名,可以层层置换。 6 , 对程序中用双撇号括起来的字符串内的字符,即使与宏名相同,也不进行置换。 7 , 宏定义是专门用于预处理命令的一个专有名词,它与定义变量的含义不同,只做字符替换不做内存分 配。 带参数的宏定义,不只进行简单的字符串替换,还进行参数替换。定义的一般形式为: #define 宏名(参 数表)字符串 如: #define S(a,b) a*b, 具体使用的时候是 int area; area=(2,3); 对带参数的宏定义是这样展开置换的:在程序中如果有带参数的宏(如 area=(2,3) ),则按#define 命令行 中指定的字符串从左到右进行置换。如果串中包含宏中的形参(如 a,b ),则将程序语句中的相关参数(可 以是常量, 变量, 或表达式) 代替形参。 如果宏定义中的字符串中的字符不是参数字符 (如上* ),则保留, 这样就形成了置换的字符串。 带参数的宏与函数有许多相似之处,在调用函数时也是在函数名后的括号内写实参,也要求实参与形参的 数目相等,但它们之间还有很大的不同,主要有: 1, 函数调用时, 先求出实参表达式的值, 然后代入形参, 而使用带参的宏只是进行简单的字符替换。 2 , 函数调用是在程序运行时处理的,为形参分配临时的内存单元。而宏展开则是在编译前进行的, 在展开时并不分配内存单元,不进行值的传递处理,也没有返回值的概念。 3 , 对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换;而宏 不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。 宏定义时,字符串可以是任何类型的数据。 4 , 函数调用只可得到一个返回值,而用宏可以设法得到几个结果。 5 , 使用宏次数多时,宏展开后源程序长,因为没展开一次都使程序增长,而函数调用不会这样。

文档评论(0)

1亿VIP精品文档

相关文档