📜  cpp文件的预处理器输出(1)

📅  最后修改于: 2023-12-03 15:14:16.538000             🧑  作者: Mango

C++ 文件的预处理器输出

在 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++ 代码之前进行替换和转换,因此理解预处理器的输出非常重要,可以帮助我们找到代码的问题、检查我们的宏定义是否正确等。