为什么在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
,你编译#include
s Class.h
.
的cpp文件
如果您在 main.cpp
中的 Class.h
之前包含向量 header,那么在预处理步骤之后,您的 main.cpp
文件将具有 [=16] 的内容=] header,后面是 Class.h
的内容,后面是 main.cpp
中的其他代码。所以 vector
的定义将在 Class
中可见。
如果你只单独编译Class.h
header,你会得到一个错误。我建议你总是这样做来检查你的 header 文件是否有所有必要的 headers 并且可以在不依赖副作用的情况下编译。
假设我有一个名为 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
,你编译#include
s Class.h
.
如果您在 main.cpp
中的 Class.h
之前包含向量 header,那么在预处理步骤之后,您的 main.cpp
文件将具有 [=16] 的内容=] header,后面是 Class.h
的内容,后面是 main.cpp
中的其他代码。所以 vector
的定义将在 Class
中可见。
如果你只单独编译Class.h
header,你会得到一个错误。我建议你总是这样做来检查你的 header 文件是否有所有必要的 headers 并且可以在不依赖副作用的情况下编译。