C++包括文件

C++ Including Files

本文关键字:文件 包括 C++      更新时间:2023-10-16

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

标头.h (文件(

#include <Windows.h>
#include "some_other_header.h"
class class_name
{
public:
LRESULT CALLBACK FUNC(HWND, UINT, WPARAM, LPARAM);
private:
}

来源.cpp(文件(

#include "header.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)

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

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

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

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

不过,我建议,如果您以某种方式使用windows.h中独立于header.h的东西,无论如何都要包含标头,因此您肯定知道您最终将始终包含所需的标头。任何自重的库头文件,包括windows.h,都可以安全地#include两次 - 它可以防止自己被重新包含在同一个翻译单元中,无论是通过包含保护还是通过#pragma once。如果header.h有一天可以更改为不需要windows.h,您希望能够在不导致一堆错误的情况下进行更改。