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