【问题标题】:C++ Including FilesC++ 包括文件
【发布时间】:2018-06-14 18:16:49
【问题描述】:

我遇到的一个问题是,当使用一个类(一个头文件,一个 cpp 文件)时,我想知道在头文件中包含一个类的源文件中也需要的文件时我应该怎么做?我举个例子

header.h(文件)

#include <Windows.h>
#include "some_other_header.h"

class class_name
{
    public:
        LRESULT CALLBACK FUNC(HWND, UINT, WPARAM, LPARAM);
    private:
}

source.cpp(文件)

#include "header.h"

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)

如您所知,LRESULT 是库的一部分,它不需要包含在“source.cpp”中,因为它包含在“header.h”文件中。问题是如果我在任何其他文件中包含“header.h”,我也不必包含,因为它已经在“header.h”中,这有点令人困惑,很难解释,但我想完全避免这可能带来的任何错误。

【问题讨论】:

标签: c++ file include


【解决方案1】:

没有必要。 #include 指令逐字复制文件内容以代替#include。因此,文件中包含的任何文件都将被包含在内。在您的示例中,您的 .cpp 文件中包含 Windows.h&gt;"some_other_header.hheader.h(以及 Windows.hsome_other_header.h 包含的任何标头)。

通常最好将它们包含在内,这样您就不必依赖上面的某些头 10 文件,但通常在头-源对中省略它。如果函数声明和定义都需要标头,则复制标头并不合理。


另一方面,由于上述机制,您应该添加标头保护。如果没有警卫,当包含来自不同来源的标头时,您可能会遇到双重定义问题。如果您要在多个文件中使用此标头,则它们是必需的,否则是良好的做法。

标准标题保护看起来像这样:

#ifndef HEADER_H //or any other name, typically it's filename or filename with path
#define HEADER_H 
//your header here
#endif

大多数编译器也支持非标准的编译指示指令L

#pragma once
//your header here

【讨论】:

    【解决方案2】:

    最好的做法是让所有文件自给自足。也就是说,每个文件都应明确包含声明此文件中使用的每个符号的标头。在每个文件中保留完整的包含列表似乎是在浪费时间,但不遵循此规则会导致代码库脆弱,其中修改一个文件中的包含可能会引发整个项目中的损坏声明海啸,并造成巨大的时间损失。

    【讨论】:

    • 你是说我应该只将文件单独包含到每个文件中吗?如果是这样,谢谢,这就是我想要做的。
    【解决方案3】:

    在您的.cpp 文件中不包含标头是安全的,只要它包含在其他位置即可。 #include 几乎与简单地将文件内容剪切并粘贴到指令所在的位置相同,因此在预处理之后,您最终会得到一个包含所有内容的巨大文件。只要它在任何使用其内容的东西之前结束,你就很好。

    不过,我建议,如果您以某种独立于 header.h 的方式使用来自 windows.h 的内容,则无论如何都要包含标题,因此您肯定会始终 最终包括您需要的标题。任何自尊的库头文件,包括windows.h,对#include 两次都是安全的——它可以防止自己被重新包含在同一个翻译单元中,无论是通过包含守卫还是通过#pragma once。如果header.h 有一天可以更改为不需要windows.h,那么您希望能够在不引起一堆错误的情况下进行更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      相关资源
      最近更新 更多