Revolucion for Monica Asked: 2020-02-29 00:20:12 +0800 CST 2020-02-29 00:20:12 +0800 CST 2020-02-29 00:20:12 +0800 CST 什么是 C++ 中的 .hpp 标头,它们的用途是什么? 772 我在针对初学者的 C++ 课程中发现,不必只使用文件.cpp,我们可以使用.hpp. 但是老师并没有解释这些文件是干什么用的。 那么.hppC++ 中的标头是什么,它们的用途是什么? c++ 2 Answers Voted Best Answer PaperBirdMaster 2020-02-29T00:32:48+08:002020-02-29T00:32:48+08:00 那么什么是 C++ 中的 .hpp 标头,它们的用途是什么? C 语言头文件有一个扩展名.h(header)。由于 C++ 是另一种语言,因此决定使用不同的扩展名,即.hpp(header plus plus)。 但这是一个任意选择,您可以使用任何您喜欢的标题扩展名;只要编译器能够读取和解释文件的内容,标题就无关紧要: #include <iostream> #include <stdio.h> #include "Ejercicio1.txt" #include "Patatas.fritas" #include "no_tengo_extension" int main() { return 0; } 我可以向你保证,如果存在Ejercicio1.txt, Patatas.fritasy文件no_tengo_extension,任何 C++ 编译器都会接受它们。 eferion 2020-02-29T02:15:12+08:002020-02-29T02:15:12+08:00 在 C++ 中构建代码时,您可以选择将所有代码放在一个文件中: 文件 1 #include <iostream> void func(int var) { std::cout << var*2; } 主文件 #include "fichero1" int main() { func(3); } 当项目开始扩大规模时,这个解决方案会带来一些问题: 文件的每次修改都需要重新编译包含它的所有文件,这可能会使编译过程延迟几分钟甚至几小时。 解决相互依赖变得复杂。例如,以下代码将无法编译: 文件A #pragma once #include "ficheroB" struct A { void func(B* b) { b->func1(); } void func1() { std::cout << "A\n"; } }; 文件B #pragma once #include "ficheroA" struct B { void func(A* a) { a->func1(); } void func1() { std::cout << "B\n"; } }; 主文件 #include "ficheroA" #include "ficheroB" int main() { A a; B b; a->func(b); b->func(a); } 注意:#pragma once即使在代码中放入最少的装饰不是标准的,我也选择使用。 为了解决这两个问题,我们可以选择将函数和类一分为二(定义和实现): 定义:它是公共部分或标头,表示函数或类的接口。 实现:它是私有部分。这是源代码。 上面的例子适当地改编了: 文件A #pragma once class B; struct A { void func(B* b); void func1(); }; 文件A.cpp #include "ficheroA" #include "ficheroB" void A::func(B* b) { b->func1(); } void A::func1() { std::cout << "A\n"; } 文件B #pragma once class A; struct B { void func(A* a); void func1(); }; 文件B.cpp #include "ficheroA" #include "ficheroB" void B::func(A* a) { a->func1(); } void B::func1() { std::cout << "B\n"; } 通过将声明与实现分离,相互依赖关系已得到解决(依赖关系已移至实现文件,没有其他文件依赖于该文件),现在可以编译代码。 因此,标头将用于指示类和函数的接口,而将源代码归入实现文件。 注意:和inline函数必须在头文件中承载实现constexpr,template因为当前的限制阻止编译器在源代码文件中定位它们的实现。
C 语言头文件有一个扩展名
.h
(header)。由于 C++ 是另一种语言,因此决定使用不同的扩展名,即.hpp
(header plus plus)。但这是一个任意选择,您可以使用任何您喜欢的标题扩展名;只要编译器能够读取和解释文件的内容,标题就无关紧要:
我可以向你保证,如果存在
Ejercicio1.txt
,Patatas.fritas
y文件no_tengo_extension
,任何 C++ 编译器都会接受它们。在 C++ 中构建代码时,您可以选择将所有代码放在一个文件中:
文件 1
主文件
当项目开始扩大规模时,这个解决方案会带来一些问题:
文件A
文件B
主文件
注意:
#pragma once
即使在代码中放入最少的装饰不是标准的,我也选择使用。为了解决这两个问题,我们可以选择将函数和类一分为二(定义和实现):
上面的例子适当地改编了:
文件A
文件A.cpp
文件B
文件B.cpp
通过将声明与实现分离,相互依赖关系已得到解决(依赖关系已移至实现文件,没有其他文件依赖于该文件),现在可以编译代码。
因此,标头将用于指示类和函数的接口,而将源代码归入实现文件。
注意:和
inline
函数必须在头文件中承载实现constexpr
,template
因为当前的限制阻止编译器在源代码文件中定位它们的实现。