繁体   English   中英

预处理器指令

[英]Preprocessor directives

当我们看到#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”的文件。 当它找到它时,它会用名为“iostream”的文件的完整内容替换输入程序中的“#include”行,并将结果添加到输出中。 但是,它然后移动到它从“iostream”文件读取的第一行,寻找它理解的更多指令。

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

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

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

更多信息:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM