4

当我们看到#include <iostream>时,它被称为预处理器指令

#include---> 指令

而且,我认为:

<iostream>---> 预处理器

但是,“预处理器”和“指令”是什么意思?

4

3 回答 3

8

#include预处理器指令<iostream>只是除了这个指令之外提供的一个参数,在这种情况下它恰好是一个文件名。

一些预处理器指令带参数,有些则不带参数,例如

#define FOO 1

#ifdef _NDEBUG
    ....
#else
    ....
#endif

#warning Untested code !

共同的特点是它们都以#.

在过去,处理器是一个单独的工具,它在将源代码传递给编译器前端之前对其进行预处理,执行宏替换和包含头文件等。如今,预处理器通常是编译器的一个组成部分,但它本质上只是做同样的工作。

于 2011-01-21T09:16:49.337 回答
8

思考“指令”与“被给予的指令”(即命令)之间的关系可能会有所帮助。“预处理器指令”是对处理器的指示,说明它应该在编译的后期阶段开始之前对代码进行更改。

但是,预处理器是什么?好吧,它的名字反映了它在编译的“主要”阶段之前处理源代码。它只是用来处理文本源代码,以各种方式对其进行修改。预处理器甚至不理解它所操作的标记——它没有类型或变量、类或函数的概念——它只是用引号和/或括号分组、逗号和/或空格分隔的文本进行处理。这个额外的过程为选择、组合甚至生成程序的各个部分提供了更大的灵活性。

编辑解决@SWEngineer的评论:许多人发现将预处理器视为修改C++程序的单独程序很有帮助,然后将其输出提供给“真正的”C++编译器(这几乎是过去的方式)。当预处理器看到#include <iostream>它认为“啊哈 - 这是我理解的事情,我会处理这个问题,而不是盲目地将它传递给 C++ 编译器”。因此,它会搜索许多目录(一些标准目录,例如/usr/include编译器安装自己的头文件的位置,以及使用指定的其他目录)-I在命令行上)寻找一个名为“iostream”的文件。当它找到它时,它会将输入程序中的“#include”行替换为名为“iostream”的文件的完整内容,并将结果添加到输出中。但是,它然后移动到它从“iostream”文件中读取的第一行,寻找它理解的更多指令。

所以,预处理器非常简单。它可以理解#include, #define, #if// #elif, and #endif, and ,但其他的不多。它不知道什么是“#ifdef$ifndef#warning#errorint" 是一个模板、一个类或任何“真正的” C++ 东西。它更像是一些自动编辑器,可以剪切和粘贴部分文件和代码,准备 C++ 编译器最终将看到和处理的程序。预处理器仍然非常有用,因为它知道如何在所有这些不同的目录中查找程序的各个部分(编译的下一阶段不需要知道任何相关内容),并且它可以删除可能适用于其他目录的代码计算机系统,但对正在使用的系统无效。它还可以允许程序使用简短、简洁的宏语句,生成大量真实的 C++ 代码,使程序更易于管理。

于 2011-01-21T10:12:22.813 回答
0

预处理器指令,例如#define#ifdef,通常用于使源程序易于更改并易于在不同的执行环境中编译。源文件中的指令告诉预处理器执行特定的操作。例如,预处理器可以替换文本中的标记,将其他文件的内容插入到源文件中......

#include是一个预处理器指令,意味着它由编译器的预处理器部分使用。这发生在编译过程之前。需要指定要包含的#include“内容”,这是由参数提供的iostream。这告诉预处理器包含该文件iostream.h

更多信息:

于 2011-01-21T09:22:18.010 回答