您的位置:首页 > 编程语言 > C语言/C++

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

2019-09-20 09:51 253 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_43569276/article/details/101051335

C/C++基础 -- 预处理命令

  • 3、# 和 ## 预处理运算
  • 4、文件包含命令
  • 4.2、头文件重复包含问题
  • 5、条件编译
  • 本博文由 西北工业大学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,其命令形式为:

    例:

      使用条件编译,可以实现在不同环境条件下进行不同类型的编译,以提高代码的适用范围。

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: