预处理是在将源代码发送到编译器之前对预处理器指令进行扩展或处理的阶段。此类指令最常见的示例是#include或#define 。预处理器输出的扩展名为“ .i” 。
在此处创建两个文件:
C++
// C++ program for the test.cpp
#include "MyHeader.h"
#include
using namespace std;
#define VAL 9
// Driver Code
int main()
{
// powerOfTwo function is defined
// in “MyHeader.h”
cout << powerOfTwo(VAL) << endl;
return 0;
}
MyHeader.h
// Below is code for the header file
// named as "MyHeader.h"
#pragma once
// Function to find the value of 2^x
size_t powerOfTwo(const int x)
{
// return the value
return 1 << x;
}
现在在命令提示符下,可以通过两种方式对输出进行预处理:
方法1 – cmd.exe内部:不建议使用此方法。
g++ -E test.cpp
在这里,输出无法显示,因为头文件iostream将扩展到50000行。这将在命令提示符下打印所有数据,这可能需要一些时间,因为cout的打印速度很慢。按任意键可在提示时停止打印。命令提示符不会保留所有50000行。它有其自身的局限性,在此之后看不到早期的输出。
方法2 –创建一个显式文件“ .i” :
使用下面给出的命令获取hello.i
g++ -E test.cpp -o hello.i
输出:
说明:在上面的输出中,只有26000行。这是正常的,因为iostream是一个很大的头文件,并且还包含许多其他头文件,而这些头文件确实包含其他头文件。 #include指令仅复制相应头文件的内容。
如前所述,实际程序位于26527行的最末端,但仍然会给出正确行的错误消息。同样,多个文件的所有内容都被包装到hello.i中,但是仍然收到错误消息以获取正确的文件上下文。
这是怎么发生的?
# 7 "MyHeader.h"
这是线路控制指令。它将告诉编译器,下一行是文件MyHeader.h中的第七行。如果执行了以上代码,则在行7处定义了powerOfTwo()函数。此外,宏VAL被9完全替换。
几件有趣的事情:
- 可以使用以下命令来编译预处理器输出文件:
g++ hello.i -o test.exe
- 预处理include指令:
// test.cpp
#include
int main(){
std::cout << "GeekForGeeks" << std::endl
#include"MyHeader.h"
}
// MyHeader.h
;
在上面的示例中,通过#include指令将分号从MyHeader.h复制并粘贴到cout语句旁边的行。因此,这里不会产生错误。另外,无论如何, Myheader.h可以是文本文件, Python文件或HTML文件, #include只会复制它。