头文件是否应该插入两次
Should a header file be inserted twice?
我有以下关于包含头文件的问题。我正在学习课程,出现了以下问题:
有人告诉我,类的声明应该放在一个单独的头文件中,例如
//TestClass.hpp
#include <string>
class TestClass{
private:
void init();
public:
double r;
double a;
std::string Type;
TestClass(const std::string& stringType);
};
在相应的测试类中.cpp我正确地定义了所有内容:
// TestClass.cpp
//
#include "TestClass.hpp"
#include <string>
#include <iostream>
void TestClass::init()
{ // Initialise all default values
// Default values
r = 0.08;
a = 0.30;
Type = "Hello";
}
TestClass::TestClass(const std::string& stringType)
{ // Create option type
init();
Type = stringType;
if (Type == "hello")
Type = "Hello";
}
如果我在头文件中包含指令<string>
,我是否必须再次将其包含在 TestClass.cpp 文件中?
不,您在头文件中声明的所有内容都将被拉取到包含头文件的任何文件中。顺便说一下,您应该添加一个包含保护/#pragma once
。
不,你没有,但无论如何我都会这样做以使代码更清晰:你明确地说"这段代码需要string
才能正常工作"。如果将来由于某种原因决定不使用TestClass.hpp
,代码将停止编译,并且您必须手动解决缺少的包含。
请记住,#include
不会有任何魔术,它只是打开您指定的文件,并将#include
替换为该文件的内容。所以你需要将文件TestClass.hpp
粘贴到TestClass.cpp
中,但随后你需要将文件string
粘贴到TestClass.hpp
中。实际上,string
也将包含在TestClass.cpp
中。
这就出现了第二个问题:你的文件中没有包含保护。如果你#include
一个文件,同时#include
你的TestClass.hpp
,你会收到编译错误。正确实现的 C++ 标头看起来更不像以下内容:
#ifndef TESTCLASS_HPP
#define TESTCLASS_HPP
// Code
#endif
这样可以确保,如果您的文件第二次被包含,它实际上不会被使用。
这也可以通过使用自动包含保护来实现:
#pragma once
但是,这是非标准的,因此某些编译器可能会拒绝识别它。
相关文章:
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- Qt插槽调用了两次
- 做 std::用相同的unique_ptr移动两次
- C++两次定义相同的函数会导致错误
- 多次插入 (<<) 与串联输出 (+)
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 使用柯南打包时如何避免列出两次依赖?
- 如何循环两次,将不同的值插入两个不同的堆栈
- 插入 std::unordered_map 在 MSVC++ 的 STL 中调用哈希函数两次,设计不好还是特殊原因?
- 头文件是否应该插入两次