面试问题4:C语言预处理包括哪些

问题描述:C语言 预处理包括哪些操作

  C语言的三种预处理包括:宏定义(#define)、文件包含(#include)、条件编译(#if、#else、#endif)。

对于宏定义的介绍:

   宏定义必须写在函数外,其作用域为宏定义起到源程序结束。C语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为宏的标识符称为“宏名”。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换,这称为宏替换或宏展开。

  无参宏的宏名后不带参数。其定义的一般形式为: #define  标识符  字符串。 其中,“#”表示这是一条预处理命令(以#开头的均为预处理命令)。“define”为宏定义命令。“标识符”为符号常量,即宏名。“字符串”可以是常数、表达式、格式串等。

  C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。
     对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。 带参宏定义的一般形式为:  #define  宏名(形参表)  字符串
  举例说明:
  #define INC(x) x+1  //宏定义
   y = INC(5);           //宏调用
     在宏调用时,用实参5去代替形参x,经预处理宏展开后的语句为y=5+1。
  
带参宏注意事项:
(1)宏名和形参表的括号间不能有空格。
(2)宏替换只作替换,不做计算,不做表达式求解。
(3)函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存。
(4)宏展开不占用运行时间,只占编译时间,函数调用占运行时间(分配内存、保留现场、值传递、返回值)。
(5)为防止无限制递归展开,当宏调用自身时,不再继续展开。如:#define TEST(x)  (x + TEST(x))被展开为1 + TEST(1)。
#include<a.h>和#include“ a.h“ 的区别:
使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的include目录),而不在当前源文件目录去查找;
使用双引号则表示首先在当前源文件目录中查找,若未找到才到包含目录中去查找。用户编程时可根据自己文件所在的目录来选择某一种命令形式。
 
原文地址:https://www.cnblogs.com/zpfbuaa/p/5330238.html