c++ - 嵌套标题包含延长编译
问题描述
在我的项目中,我使用的是动态包含的第三方库 - 即通过导入 *.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 次,并且编译会一直持续下去。我能做些什么来避免这种情况?
解决方案
也包含在我项目的几个 *.cpp 文件中。
如果您编译例如 2 个源,包括直接或间接包含您的标头,则其中一个将总共包含 2 次。保护仅针对一个源文件,每次编译器移动到另一个源文件进行编译时,都不知道任何标头。否则,这意味着编译的源文件的顺序是相关的,这是无法管理的,这是makefile的结尾并强制重新编译所有文件,无论您修改了什么文件。
其中你错#endif
过了头文件末尾的
推荐阅读
- swift - 命令行 Swift 脚本的最小可行 GUI 是什么?
- python - 如何捕获带有符号前缀的模式?
- javascript - 传单:通过单击功能缩放到标记
- react-native - 在 JSX 中添加样式后,React Native 应用程序在 IOS 中崩溃
- reactjs - 在 React 函数式组件中访问 Refs
- r - 如何从 url 读取 IMF xls- 或 sdmx-data?
- javascript - 滚动锁定在移动设备上
- python - 取决于 Pandas Dataframe 列的值数组
- angular - 无法绑定到“dividerColor”,因为它不是“mat-form-field”的已知属性
- c++ - 在 unordered_map 的键上实现“你的意思是”