当我们看到#include <iostream>
时,它被称为预处理器指令。
#include
---> 指令
而且,我认为:
<iostream>
---> 预处理器
但是,“预处理器”和“指令”是什么意思?
当我们看到#include <iostream>
时,它被称为预处理器指令。
#include
---> 指令
而且,我认为:
<iostream>
---> 预处理器
但是,“预处理器”和“指令”是什么意思?
#include
是预处理器指令,<iostream>
只是除了这个指令之外提供的一个参数,在这种情况下它恰好是一个文件名。
一些预处理器指令带参数,有些则不带参数,例如
#define FOO 1
#ifdef _NDEBUG
....
#else
....
#endif
#warning Untested code !
共同的特点是它们都以#
.
在过去,预处理器是一个单独的工具,它在将源代码传递给编译器前端之前对其进行预处理,执行宏替换和包含头文件等。如今,预处理器通常是编译器的一个组成部分,但它本质上只是做同样的工作。
思考“指令”与“被给予的指令”(即命令)之间的关系可能会有所帮助。“预处理器指令”是对预处理器的指示,说明它应该在编译的后期阶段开始之前对代码进行更改。
但是,预处理器是什么?好吧,它的名字反映了它在编译的“主要”阶段之前处理源代码。它只是用来处理文本源代码,以各种方式对其进行修改。预处理器甚至不理解它所操作的标记——它没有类型或变量、类或函数的概念——它只是用引号和/或括号分组、逗号和/或空格分隔的文本进行处理。这个额外的过程为选择、组合甚至生成程序的各个部分提供了更大的灵活性。
编辑解决@SWEngineer的评论:许多人发现将预处理器视为修改C++程序的单独程序很有帮助,然后将其输出提供给“真正的”C++编译器(这几乎是过去的方式)。当预处理器看到#include <iostream>
它认为“啊哈 - 这是我理解的事情,我会处理这个问题,而不是盲目地将它传递给 C++ 编译器”。因此,它会搜索许多目录(一些标准目录,例如/usr/include
编译器安装自己的头文件的位置,以及使用指定的其他目录)-I
在命令行上)寻找一个名为“iostream”的文件。当它找到它时,它会将输入程序中的“#include”行替换为名为“iostream”的文件的完整内容,并将结果添加到输出中。但是,它然后移动到它从“iostream”文件中读取的第一行,寻找它理解的更多指令。
所以,预处理器非常简单。它可以理解#include
, #define
, #if
// #elif
, and #endif
, and ,但其他的不多。它不知道什么是“#ifdef
$ifndef
#warning
#error
int
" 是一个模板、一个类或任何“真正的” C++ 东西。它更像是一些自动编辑器,可以剪切和粘贴部分文件和代码,准备 C++ 编译器最终将看到和处理的程序。预处理器仍然非常有用,因为它知道如何在所有这些不同的目录中查找程序的各个部分(编译的下一阶段不需要知道任何相关内容),并且它可以删除可能适用于其他目录的代码计算机系统,但对正在使用的系统无效。它还可以允许程序使用简短、简洁的宏语句,生成大量真实的 C++ 代码,使程序更易于管理。
预处理器指令,例如#define
和#ifdef
,通常用于使源程序易于更改并易于在不同的执行环境中编译。源文件中的指令告诉预处理器执行特定的操作。例如,预处理器可以替换文本中的标记,将其他文件的内容插入到源文件中......
#include
是一个预处理器指令,意味着它由编译器的预处理器部分使用。这发生在编译过程之前。需要指定要包含的#include
“内容”,这是由参数提供的iostream
。这告诉预处理器包含该文件iostream.h
。
更多信息: