预处理器指令

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 ”为例进行解释?因为我快要明白了。谢谢。 @Tony。 (“预处理器指令”是对预处理器的指示,说明它应该在编译的后期阶段开始之前对代码进行更改)。这里有哪些变化的例子?谢谢。 @Tony。很抱歉我在这里提出了很多问题。关于“预处理器”,您能更详细地描述一下吗?谢谢。 @SWEngineer:我试图在上面解释得更好一些。希望有帮助。不过,我还有其他地方要去 - 可能数小时或数天都无法在线查看……抱歉。希望够了。 @Tony。非常感谢您的精彩解释,非常感谢。当你找到某个时候,这只是一件小事。当你说:“但是,它接下来会移动到它从“iostream”文件中读取的第一行,寻找更多它理解的指令。”。 .cpp 文件中要编译和运行的其他预处理器指令呢?非常感谢。【参考方案2】:

#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

以上是关于预处理器指令的主要内容,如果未能解决你的问题,请参考以下文章

笔记2:预处理器-预处理指令

C#预处理器指令

C#预处理器指令 ,你造吗??? (●'?'●)

C ++中的宏指令和预处理器指令有啥区别[重复]

预处理器宏扩展为另一个预处理器指令

Objective-C 预处理器指令