C/C++基础 -- 预处理命令(宏定义、文件包含、条件编译)

本博文由 西北工业大学MOOC 总结而来,以备以后回顾。(侵删)

1、预处理命令

什么是预处理命令
  在C++文件中,只要是以 “#” 开头的命令都称为预处理命令。
  预处理命令不是C++本身的组成部分,更不是C++的语句(所以不能以 " ; " 结尾),它是C++标准规定的可以出现在C++源文件中的命令
  预处理命令都必须以 " # " 开头,结尾不加分号,可以放置在程序源文件中的任何位置,其有效范围是从出现位置开始到程序源文件末尾

程序的编译过程
  要想清楚预处理命令的作用,我们就要知道程序文件编译连接处理的过程:
在这里插入图片描述
1)预处理阶段:将C源程序中的预处理命令("#"开头的命令)执行下去,实现文本的替换,与处理完后将会得到不包含预处理命令的源程序
2)编译阶段:预处理后的源程序代码进行编译,生成目标代码。
3)连接阶段:将目标代码与相关的程序文件进行连接,生成最终的可执行文件。
  接下来,我们就介绍四种预处命令。

2、宏定义

  C++源程序中允许使用一个标识符来代表一个字符文本,称为。标识符为宏名
  宏是由宏定义事先定义的。预处理时,对程序中所有后续的宏名实例(称为宏引用),预处理器都用字符文本去替换,称为宏替换宏展开
  宏定义通常用于定义程序中的符号常量、类型别名、运算式代换、语句代换等,其命令为 #define , 分为不带参数的宏定义带参数的宏定义

2.1、不带参数的宏定义

不带参数的宏定义形式为:
在这里插入图片描述
  其功能是用宏名去替代后面的字符文本。举例如下:
在这里插入图片描述
  需要注意的是,宏定义只作简单替换,不作语法检查,因此,宏定义中的每个字符都是有效字符,即都将被替换到程序文件中。所以宏定义中多余的字符会导致编译出错,如:
在这里插入图片描述
例:
在这里插入图片描述

2.2、带参数的宏定义

带参数的宏定义命令形式为:
在这里插入图片描述
带参数的宏的引用形式为:

在这里插入图片描述
例:
在这里插入图片描述
  此外,为了保证宏展开的结果符合设计本意,应在宏定义或者实参串中加入必要的括号,如:在这里插入图片描述
第二种形式:
在这里插入图片描述

3、# 和 ## 预处理运算

3.1、# 预处理运算符

  #运算符的作用是文本参数“字符串化”,即出现在宏定义字符文本中的 # 把跟在后面的参数转换成一个C++字符串常量。如下:
在这里插入图片描述

3.2、## 预处理运算符

  ##运算符的作用是将两个字符文本连接成一个字符文本,如果其中一个字符文本是宏定义的参数,连接会在参数替换后发生。如下:
在这里插入图片描述

4、文件包含命令

  文件包含命令的作用是把指定的文件插入到该命令所处的位置上,并取代该命令,然后再进行编译处理,相当于将文件的内容“嵌入”到当前源文件中一起编译。
  文件包含命令有两种形式:
在这里插入图片描述

4.1、文件包含中的路径问题

  文件包含命令中的头文件名可以是绝对路径形式,例如:
在这里插入图片描述
  文件名也可以是相对路径,例如:
在这里插入图片描述
  当为相对路径时,文件包含命令是相对于系统INCLUDE路径或者用户路径来查找文件的。
  假设编译系统INCLUDE路径为"C:\DEV\MinGW\include",则
在这里插入图片描述
  加入用户路径为"D:\Devshop",则
在这里插入图片描述

尖括号<>和双引号" "的区别

  使用尖括号<> 包含头文件时,编译器只会在系统路径中查找文件,如果查找不到则会编译出错。
  而使用双引号" " 包含头文件时,编译器会现在用户路径中查找文件,然后再在系统路径中查找文件,如果都找不到,则报错

4.2、头文件重复包含问题

  头文件有时需要避免重复包含(即多次包含),例如一些特定声明不能多次声明,或者头文件的互相包含,而且重复包含增加编译时间。可以采用以下两个办法之一:
①使用条件编译
②使用特殊预处理命令#pragma
  #pragma的使用方法比较复杂,所以我们接下来看条件编译。

5、条件编译

5.1、 #ifdef条件编译命令

  测试条件字段是否被定义,藉此选择参与编译的程序代码段,有两种明明形式:
①形式一:(#ifdef #endif)
在这里插入图片描述
②形式二:(#ifdef #else #endif)
在这里插入图片描述
例:
  如果DEBUG已经定义,则编译printf语句,否则不编译:
在这里插入图片描述

5.2、 #if条件编译命令

  根据表达式的之选择参与编译的程序代码,其命令形式为:
在这里插入图片描述
  可以使用嵌套的#if条件编译命令:#if #elseif #else #endif,其命令形式为:
在这里插入图片描述
例:
在这里插入图片描述
  使用条件编译,可以实现在不同环境条件下进行不同类型的编译,以提高代码的适用范围。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值