C ++包含文件

时间:2018-06-14 18:16:49

标签: c++ file include

我遇到的一个问题是当使用类(一个标题,一个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(file)

#include "header.h"

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

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

3 个答案:

答案 0 :(得分:0)

没有必要。 #include指令在#include的位置逐字复制文件的内容。因此,文件中包含的任何文件都将包含在内。在您的示例中,您的.cpp文件中包含Windows.h>"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

大多数编译器也支持非标准的pragma directiveL

#pragma once
//your header here

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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

我建议,如果您以某种方式使用来自windows.h的内容并且header.h独立,那么无论如何都要包含标题,所以您肯定知道您将始终最终包括您需要的标题。任何自尊的库头文件(包括windows.h)都可以安全#include两次 - 它不会被重新包含在同一个翻译单元中,无论是通过包含警卫还是通过{{1} }。如果#pragma once有一天可以更改为不需要header.h,那么您希望能够进行更改而不会导致一堆错误。