C++包括文件
C++ Including Files
我遇到的一个问题是在使用类(一个头文件,一个 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.h
和header.h
都包含在您的 .cpp 文件中(以及Windows.h
和some_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
,您希望能够在不导致一堆错误的情况下进行更改。
- 包括C++头文件
- 链接错误,包括我创建的相同头文件 - C++
- 标头,包括在 Swift 项目中使用C++文件时的错误
- 可执行文件C++包括.obj,.lib和.dll吗?
- 私有,包括头文件
- 包括头文件或 cpp 文件
- 如何将CPP文件包括在两个不同的CPP文件中
- 如何将标题文件包括在C DLL文件中
- 无法分离标头和cpp文件(包括错误和代码)
- 我如何grep通过所有文件#包括在文件中当前打开的vim
- 头文件包括彼此
- 博兰德C++链接器错误c文件包括
- 包括头文件(包括它们自己)
- 无法使用标头保护解决包含其自身的文件(包括标头)的错误
- C++头文件包括组织
- 如何从文件夹中读取所有txt文件?(包括子文件夹)
- c++嵌套头文件包括编译
- Qt创建者直接文件包括
- Cpp文件包括,同时也可以在其中调试
- 静态库头文件包括其他头文件。我是否需要这些头文件的实现/源文件?