【问题标题】:C++ Don't include includes from previous headerC ++不包含来自先前标头的包含
【发布时间】:2015-12-21 01:51:54
【问题描述】:

假设我有以下内容:

Main.cpp

#include <Windows.h>
#include "B.h"

...

-

B.h

...
SomePrototypeFunctionNeedingWindowsH();

-

在 B.h 中,我不需要再次包含 Windows.h,因为它已经预先包含在内。为清楚起见,我希望需要为每个需要它的新文件包含 Windows.h。我正在使用 VS2015。

这个可以吗?

这可以在不影响编译时间的情况下完成吗?

这会被认为是一种可接受的做法吗?

如果这样做,我会遇到任何问题吗?

【问题讨论】:

  • 你为什么要这样做?
  • 这就是包含守卫的用途。而且大多数编译器“理解”包含守卫,如果之前包含过,甚至不会打开文件。
  • (我个人也会在 B.h 中包含 Windows.h,因此您不必总是知道要使用 B.h,我需要包含 Windows.h)
  • 在 b.h 中包含 windows.h 是正常的方法。为什么在需要 b 的任何地方都包含 windows 和 b 是件好事?
  • 我想在 B.h 中包含 纯粹是出于语义/可读性的原因,而不是出于编译目的。进一步思考,如果存在长链头依赖关系,这可能会产生很大的问题。

标签: c++ include visual-studio-2015


【解决方案1】:

也许您正在寻找 C++ 中的预处理器指令。 它们类似于:

#ifndef HEADERFILE_H
#define HEADERFILE_H
/*Your header declarations/definitions*/
#endif

在这种预处理器技术中,您基本上告诉您的编译器它不应该多次包含同一个标头。 Refer to this post for more thorough understanding

【讨论】:

  • 不完全是,我不希望实际包含标题,因为这会导致问题。我只希望将包含作为一种文档形式包含在文件中,告诉我文件中使用了什么。如果您想分发它,它还允许文件更多地独立存在,而不必发送您拥有的所有其他文件。
【解决方案2】:

将每个.h 文件编译成一次性测试输出.objs。这可以手动完成,也可以通过脚本在您使用的任何项目管理系统上运行。

当然,必须将 .h 文件添加到项目管理系统中。

可以编译为源文件的.h 文件包括它需要的所有头文件。

确切的步骤 - 您可以遍历目录树中的每个 .h,输出一个 .h.cpp 文件,将该 .h.cpp 文件添加到您不使用的项目中,然后构建该项目。

你用什么语言写这个取决于你擅长什么脚本语言。

【讨论】:

  • 这是一个聪明的思考方式。这不是我愿意达到的程度,这只是我想要的一个功能,但绝不重要。我会记住这一点,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多