📅  最后修改于: 2023-12-03 15:14:16.538000             🧑  作者: Mango
在 C++ 中,预处理器是一组指令、转换和条件编译,它们在编译代码之前被执行。预处理器的输出是经过处理的 C++ 代码,此输出称为预处理的源代码。
在下面给出的代码片段中,我们展示了如何打印出 C++ 文件的预处理器输出。在这个示例中,我们使用 #include
和 #define
指令在源码中定义了一些常量和函数,然后使用预处理器来展开这些宏和解析 #include
指令的头文件。
// example.cpp
#include <iostream>
#include "header.h"
#define PI 3.14
int main() {
double radius;
std::cout << "Enter the radius of the circle: ";
std::cin >> radius;
double circumference = 2 * PI * radius;
std::cout << "The circumference of the circle is: " << circumference << std::endl;
double area = calculateArea(radius);
std::cout << "The area of the circle is: " << area << std::endl;
return 0;
}
// header.h
#ifndef HEADER_H
#define HEADER_H
double calculateArea(double radius);
#endif
// header.cpp
#include "header.h"
#define PI 3.14159265358979323846
double calculateArea(double radius) {
return PI * radius * radius;
}
然后,在终端中使用以下命令来编译和运行代码:
g++ -E example.cpp -o example.ii
cat example.ii
以上代码编译命令 -E
让编译器停止在预处理器阶段并输出预处理器的输出,而文件后缀 .ii
将 .cpp
文件转换为其预处理器输出的文件。执行后,会输出以下内容:
# 1 "example.cpp"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "example.cpp"
# 1 "header.h" 1
double calculateArea(double radius);
# 4 "example.cpp" 2
double PI 3.14
int main() {
double radius;
std::cout << "Enter the radius of the circle: ";
std::cin >> radius;
double circumference = 2 * 3.14 * radius;
std::cout << "The circumference of the circle is: " << circumference << std::endl;
double area = calculateArea(radius);
std::cout << "The area of the circle is: " << area << std::endl;
return 0;
}
输出内容中,# 1 "<built-in>"
和 # 1 "<command-line>"
是编译器内部文件和命令行的占位符。接下来,# 1 "example.cpp"
将进入 example.cpp
文件,继而检测并包含 header.h
头文件。对于 header.h
文件的内容,预处理器简单地将 calculateArea(double radius);
放置到输出中。
接着,使用 #define
指令定义 $\pi$ 值,将其赋值为 3.14
。在主函数中,预处理器将 PI
变量替换为 3.14
。最后,预处理器解析了 calculateArea
函数的定义,并将其展开到输出中。
这就是 C++ 文件的预处理器输出的示例。从输出中可以看到我们定义的宏、函数、包含的头文件等。预处理器在编译 C++ 代码之前进行替换和转换,因此理解预处理器的输出非常重要,可以帮助我们找到代码的问题、检查我们的宏定义是否正确等。