头文件是否应该插入两次

Should a header file be inserted twice?

本文关键字:两次 插入 文件 是否      更新时间:2023-10-16

我有以下关于包含头文件的问题。我正在学习课程,出现了以下问题:

有人告诉我,类的声明应该放在一个单独的头文件中,例如

//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

但是,这是非标准的,因此某些编译器可能会拒绝识别它。