首页 > 解决方案 > C++ 包括文件

问题描述

我遇到的一个问题是,当使用一个类(一个头文件,一个 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++fileinclude

解决方案


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

推荐阅读