C语言基础--宏定义、文件包含、条件编译

预处理

  • 文章标题提到的三个概念常常和预处理紧密联系的,所以我们先了解一下程序编译的预处理的步骤。
  • 所谓预处理是指程序进行编译过程的第一个阶段。系统会自动将’#'开头的预处理部分做进行处理,处理完毕后进行进入源程序的编译阶段。它主要处理像宏替换,文件包含、条件编译等部分。

  • C语言中提供多种预处理功能,如宏定义文件包含条件编译等。

  • 宏定义

    • 在C语言源程序中允许用一个标识符表示符号,称为宏,被定义为宏的标识符称为宏名。对程序中出现的所有宏名,都用宏定义中的符号串去替换,这称为宏替换或者宏展开。

    • 常见的宏定义符号表:

      符号实例含义
      _FILE_正在预编译源文件名
      _LINE_文件在当前的行号
      _FUNCTION_当前所在的函数名
      _DATE_预编译文件的日期
      _TIME_预编译文件的时间
      _STDC_如果编译器遵循ANSIC,则值为1

- 宏定义

  • 宏替换是在预处理时自动完成的

1.无参宏定义

#define 标识符 字符串
  • 宏定义用宏名来表示一串字符串符号,在宏展开的时候又以该符号去替代宏名,这只是一种简单的替换。
  • 宏定义不是声明或语句,在行末不必加分号,如加上分号会连分号一起替换
  • 宏定义的作用域从从宏定义命名起到源程序结束,如要终止其作用域可使用#undef命令来取消宏作用域
  • 宏名在源程序中若用引号括起来则预处理程序则不对其进行宏替换。
  • 习惯上宏名一般用大写字母。
  • 可对输出格式做宏定义,减少麻烦。

2.带参宏定义

  • C语言中允许宏带有参数,在宏定义中的参数被称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏在调用时不仅要宏展开,而且还要用实参去替换形参。一般形式如下:

    #define 宏名(形参表) 字符串
    
  • 带参宏定义中,宏名和参数表之间不能有空格出现。

    #define MAX (a,b) (a>b)?a:b	//错误例子
    

    这将会被认为是无参宏定义,宏名MAX代表字符串"(a,b) (a>b)?a:b"。

  • 在带参宏定义中,形式参数不分配内存单元,因此不必做类型定义。这与函数中的情况是不同的,在函数中,形参和实参是两个不同的量,各自有各自的作用域,调用时要把实参值赋给形参,进行值传递。而在带参数宏定义中只是符号替换不存在值传递的问题。

  • 在宏定义中,形参是标识符,而宏调用中的实参可以是表达式。这与函数调用是不同的,函数调用时要把实参表达式的值求出来再赋予形参,而宏替换中对实参表达式不做计算直接原样替换。(为避免引起问题,应该在采纳数两侧加括号,还应在整个符号串外加括号)。

- 文件包含

  • 文件包含语句的功能是把指定的文件插入该语句行位置,从而把指定的文件和当前源程序文件连成一个源文件。

  • 包含形式如下:

    #include "文件名"
    #include <文件名>
    
    • 这两种包含形式的不同点:

      1.使用<>表示的在系统头文件目录去查找(头文件目录可以由用户来指定)。

      2.使用双引号则表示首先在当前源文件的目录查找,若未找到才到系统头文件目录去查找。

      • 一个include命令只能包含一个指定的文件。
    • 文件包含允许嵌套,也就是说如果我们包含的文件中若包含了其他文件,则该文件也是被我们当前文件所包含着的。

  • 条件编译

    • 使编译器按照不同的条件去编译不同的代码,主要由一下三种形式:

      #ifdef 标识符
      程序段1
      #else
      程序段2
      #endif
      

      它表示如果标识符已经被#define语句定义过,则编译程序段1,否则编译程序段2,。如果没有程序段2,则本格式中的#else可以没有。

      #ifndef 标识符
      程序段1
      #else
      程序段2
      #endif
      

      与第一种形式的功能正好相反。

      #if 常量表达式
      程序段1
      #else
      程序段2
      #endif
      

      它的功能是,如果常量表达式的值为真(非0),则编译程序段1否则编译程序段2。因此可以是程序在不同的条件下完成不同的编译的功能。这个特性在很多大型程序中应用比较广泛。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值