首页 > 解决方案 > 嵌套标题包含延长编译

问题描述

在我的项目中,我使用的是动态包含的第三方库 - 即通过导入 *.lib 文件和 *.h 文件。lib 的 *.h 文件有一个包含保护。我#included将此文件放在我的一个项目标头中,该标头从#pragma once. 后者也包含在我项目的几个 *.cpp 文件中。

这是方案:

第三方库包括“blah_blah.h”

#ifndef BLAH_BLAH_H
#define BLAH_BLAH_H

/* stuff here */

#endif

我的项目标题“my.h”

#pragma once
#include "blah_blah.h"

/* stuff here */

我的 cpp 文件之一

#include "my.h"

/* stuff here */

问题如下。虽然在编译过程中既没有错误也没有警告,但我看到它"blah_blah.h"被包含了好几次 - 至少,由其代码产生的警告在 Visual Studio 2017 的输出窗口中出现了大约 5 次,并且编译会一直持续下去。我能做些什么来避免这种情况?

标签: c++nested-includes

解决方案


也包含在我项目的几个 *.cpp 文件中。

如果您编译例如 2 个源,包括直接或间接包含您的标头,则其中一个将总共包含 2 次。保护仅针对一个源文件,每次编译器移动到另一个源文件进行编译时,都不知道任何标头。否则,这意味着编译的源文件的顺序是相关的,这是无法管理的,这是makefile的结尾并强制重新编译所有文件,无论您修改了什么文件。

其中你错#endif过了头文件末尾的


推荐阅读