【问题标题】:Does C++ Support Global Headers At Compile Time?C++ 在编译时是否支持全局头文件?
【发布时间】:2017-03-16 08:31:27
【问题描述】:

在尝试编译外部提供的 C++ 代码库时,我遇到了一个令人困惑的问题:

缺少几个头文件#include <MyLibrary.h>,其中 MyLibrary 是一个明显的依赖项,只是缺少,并阻止编译。

我的问题是: 编译 C++ 代码时,有没有办法自动包含依赖项头文件,而无需在需要的每个 .h/.cpp 文件中 #include 它?换句话说,一种在编译所有源代码时为 C++ 预处理器提供头文件列表以自动包含的方法?

我知道这可能是一个非常糟糕的主意,但我正在尝试确定我提供的代码是否只是损坏了,或者是否有某种方法可以在不手动修复缺少依赖项的每个文件的情况下进行编译.

【问题讨论】:

  • 我不知道。建议:您确定您正在编译正确的标准,并且您安装了这些库吗?
  • 1) C 不是 C++ 不是 C。2) 你的问题不清楚。标头是代码。它们不会在运行时以任何方式使用。而#include 是使用外部定义的标准方式。你在想什么其他方法?
  • 在 Visual Studio 中,这绝对是一种方法——它将在项目的所有 .cpp 文件中包含一个文件。它是预处理器选项之一。
  • 有没有办法。不要走那条路!你可能打破的比你修复的要多。按预期方式添加依赖项有什么问题?
  • @Olaf 显然,您必须接触许多您可能不想要的源文件,例如为了完整性,因为您没有对它们的写权限,因为它们太多了实验中...我知道 OP 要求这不是软件工程的最佳实践,而是快速测试。

标签: c++ compiler-errors c-preprocessor header-files


【解决方案1】:

C++ 语言标准不支持“全局标头”,但个别编译器支持。

这称为强制包含

对于 Visual C++,它是选项 /FI,对于 g++,它是选项 -include


然而,对于 Visual C++,包含公共标头的常用方法是将这些包含放在一个名为 stdafx.h 的文件中,然后首先将该文件包含在每个翻译单元中。这是 Visual C++ 的预编译头文件支持的一部分。这是有问题的,因为当它打开时(并且它在 Visual Studio 项目中默认打开)它会更改预处理规则,因此某些标准代码可能无法编译,但它可以大大加快更大的构建速度。

【讨论】:

  • 匿名投反对票:请解释您的投反对票,以便读者以后更容易忽略您的 cmets 和投票。谢谢。
【解决方案2】:

是的,至少使用 gcc 和兼容的。:使用 -include 选项。见https://stackoverflow.com/a/3387518/3150802

【讨论】:

  • 这是一个非常糟糕的主意,并且违背了构建工具。
  • @Olaf 我从未使用过它,但我无法立即看到这两种说法的有效性。你能详细说明一下吗?
  • 如何例如Scons 检测到额外的依赖项?更不用说如果您更改依赖项,您必须编辑一个意外文件(构建文件)而不是实际受影响的文件(源代码)。与重要的“最小惊喜”设计原则大相径庭。
  • @Olaf 啊,我明白了。是的,依赖分析器可能会忽略它(除非你使用 gcc 适合它......)但是,由于配置文件是 Python,所以将这个依赖编辑成 SCons 应该是微不足道的......
  • 不确定 gcc 是否会尊重命令行中的 incoudes。重新手动编辑:这正是我的第二个问题。不管你怎么看:这是一个非常糟糕的想法和糟糕的设计实践。
猜你喜欢
  • 1970-01-01
  • 2011-09-04
  • 2010-09-22
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
相关资源
最近更新 更多