• 面试问题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目录),而不在当前源文件目录去查找;
    使用双引号则表示首先在当前源文件目录中查找,若未找到才到包含目录中去查找。用户编程时可根据自己文件所在的目录来选择某一种命令形式。
     
  • 相关阅读:
    GolandQuick编辑器快捷键
    GitStand
    高阶函数
    文本和字节序列
    元组用法
    映射的弹性键查询
    字典的setdefault()
    数组、内存视图、双向队列
    Python之random.seed()用法
    用bisect来管理已排序的序列
  • 原文地址:https://www.cnblogs.com/zpfbuaa/p/5330238.html
Copyright © 2020-2023  润新知