高质量C++小白教程:2.10-预处理器简介

当你在编译项目时,你可能希望编译器完全按照你编写的方式编译每一个代码文件,当事实并非如此。

相反,在编译之前,每一个.cpp文件都会经历一个预处理的阶段,在此阶段中,称为预处理器的程序对代码文件的文本进行各种更改.

预处理器实际上不会以任何方式修改原始代码文件,预处理器所做的更改要么临时发生在内存中,要么使用临时文件。

从历史角度看,预处理器是与编译器分开的程序,但在现代编译器中,预处理器可以直接构建到编译器本身中。

预处理器所做的大部分工作都是相当无趣的,例如,它删除注释,并确保每个代码文件以换行符结束。然而,预处理器确实有一个非常重要的作用:处理#include指令;


但预处理器完成对代码文件的处理时,结果称为 翻译单元 该翻译单元随后由编译器编译。

预处理、编译、链接的整个过程称为翻译;


预处理器指令

当预处理器运行时,它会从上到下的扫描代码文件,插在预处理指令。

预处理指令 通常称为指令,是以#符号开头并以换行符结尾的指令。这些指令告诉预处理器执行某些文本创作任务。

请注意,预处理器不理解c++语法,相反,它有自己的指令语法,只能说类似c++语法。


#Include

想必你已经看到了*#include指令的实际应用(通常是 #include )。当您#include*文件时,预处理器会将 #include 指令替换为所包含文件的内容。然后对包含的内容进行预处理(这可能会导致递归地预处理额外的 #include),然后对文件的其余部分进行预处理。

考虑下面的程序:

#include<iostream>

int main() 
{
   
   
  std::cout << "Hello,cpp\n";
  
  return 0;
}

当预处理器在此程序上运行时,预处理器将用名为“iostream”文件的v内容替换#include<iostream>然后预处理包含的内容和文件的其余部分。

每个翻译单元通常由单个代码 (.cpp) 文件和它 #include 的所有头文件组成(递归应用,因为头文件可以 #include 其他头文件)。


宏定义

#define指令可用于创建宏,在C++中,宏是定义如何将输入文本替换为输出文本的规则。

宏有两种基本类型:

  • 类对象宏
  • 类函数宏

类函数宏的行为类似于函数,并具相似的用途,他们的使用通常被认为是不安全的,几乎他们能做的任何事情都可以通过普通的函数完成。

类对象宏的定义可以通过下面两种方式之一:

#define IDENTIFIER
#define IDENTIFIER substitution_text

顶部定义没有替换文本,而底部定义有。因为这些是预处理器指令(而不是语句),所以请注意,这两种形式都不以分号结尾。

宏的标识符使用与普通标识符相同的命名规则:可以使用字母、数字和下划线,不能以数字开头,也不应该以下划线开头。按照约定,宏名称通常全部大写,并用下划线分隔。记住,无须加上分号。

带有替换文本的类对象宏

当预处理器遇到此指令时,宏标识符和替换文本之间会建立关联。所有进一步出现的宏标识符都将会被替换文本替换。

考虑下面的程序:

#include <iostream>
#define MY_NAME "Alex"
int main()
{
   
   
    std::cout << "My name is:" << MY_NAME << '\n';
    
    return 0;
}	

预处理器将上面的内容转换为一下内容:

// The contents of iostream are inserted here
int main()
{
   
   
    std::cout << "My name is: " << "Alex" << '\n';

    return 0;
}

运行时,会打印输出My name is: Alex

使用带有替换文本的类对象宏(在 C 中)作为将名称分配给文字的方法。这不再是必要的,因为 C++ 中有更好的方法。现在大

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xayla

轻轻一点,暖心房

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值