为什么在class'B'的源文件中导入class'A'的header文件,就定义了class'A'的内容在 class 'B' 的 header 文件中?

Why importing the header file of class 'A' in the source file of class 'B' makes the content of class 'A' defined inside the header file of class 'B'?

假设我有一个名为 Class:

的 class

Class.h:

#pragma once

class Class
{
public:

    std::vector<int> x();
};

Class.cpp:

#include <vector>
#include "Class.h"

std::vector<int> Class::x()
{
    return std::vector<int>();
}

我想这段代码应该无法编译,因为 std::vector 没有在 Class.h 中定义。但是代码有效。如果我在包含 Class.h 之后包含所需的 headers(在本例中它只是 vector),它将不起作用。但只要在包含 Class.h 之前导入所需的 header,一切正常。如果我尝试单独在某个地方包含 Class.h 并尝试使用它,它也不起作用。例如,这段代码将不起作用:

    #include <iostream>
    #include "Class.h"

    int main()
    {
        Class c;
        auto x = c.x();

        x.push_back(1);
        x.push_back(2);
        x.push_back(3);

        for (auto i : x)
            std::cout << i << ' ';
    }

但是如果我包含所需的 headers,它工作正常。所以在这个例子中,如果我包含 vector header(也必须在包含 Class.h 之前):

#include <vector>
#include "Class.h"
#include <iostream>

int main()
{
    Class c;
    auto x = c.x();

    x.push_back(1);
    x.push_back(2);
    x.push_back(3);

    for (auto i : x)
        std::cout << i << ' ';
}

我认为 #include 只是 copy-pasting。在 Class.h 中,没有包含 header。怎么可能说这个函数会 return 一个 std::vector 而没有被定义呢?为什么在源文件中包含 headers 使其就像包含在 header 文件中一样?

你不编译Class.h,你编译#includes Class.h.

的cpp文件

如果您在 main.cpp 中的 Class.h 之前包含向量 header,那么在预处理步骤之后,您的 main.cpp 文件将具有 [=16] 的内容=] header,后面是 Class.h 的内容,后面是 main.cpp 中的其他代码。所以 vector 的定义将在 Class 中可见。

如果你只单独编译Class.h header,你会得到一个错误。我建议你总是这样做来检查你的 header 文件是否有所有必要的 headers 并且可以在不依赖副作用的情况下编译。