【问题标题】:Question about #include in header files (c++)关于头文件中#include的问题(c ++)
【发布时间】:2022-10-12 21:26:17
【问题描述】:

所以我在头文件中使用#include 时遇到了一些奇怪的问题。目标是使任何自定义或通用系统都集中在一个地方,我可以将其包含在我正在处理的任何文件中。到目前为止,这一直有效,但我最近注意到,我添加到其中的新头文件似乎无缘无故无法访问之前包含的任何代码,就像其他代码一样。它的设置有点像这样:

// includes.h
#include <cstdlib>
#include <iostream>
#include <vector>
#include <map>
#include <random>
#include <cmath>
#include <memory>
#include "a.h"
#include "b.h"
#include "c.h"

现在发生的事情是a.hb.h 可以使用它们上面包含的所有代码,而b.h 可以使用a.h 的代码,但似乎没有理由,c.h 不能使用任何包含的代码在它上面,但偶尔制作一个具有不同名称的全新头文件会起作用。我不知道是什么导致了这个问题,并且很想帮助理解这个问题。如果需要提供更多说明,请告诉我。

【问题讨论】:

  • 我建议您让每个头文件都包含他们自己需要的内容。
  • 请显示minimal reproducible example,猜测您的标题是从其他地方首先包含的
  • a.hb.hc.h 之间是否存在相互依赖或循环依赖?
  • 我不知道如何提供可复制的示例,因为它似乎是随机发生的。我试图制作一个名为“World.h”的头文件,它无法访问includes.h文件中包含的任何内容,但是当我专门制作一个名为“test.h”的头文件来测试我遇到的这个问题时,我能够访问它之前包含的代码,尽管这两个文件实际上都是空的,除了一行尝试使用它之前的代码并且都以相同的方式包含在 include.h 文件中

标签: c++


【解决方案1】:

每个标题都应包含他们使用的内容。它不应该依赖于用户来包含。

例如:C 使用 B,B 使用 A

  • c.h:#include B.h
  • b.h:#include A.h

也不要忘记在标题中添加#pragma once。这将导致该头文件只会被加载一次。 例如:如果你有一个 D 类,其中包括 A.h.即使 B 和 D 都使用 A.h,它也只会加载一次。

也可以看看: https://www.incredibuild.com/blog/include-what-you-use-how-to-best-utilize-this-tool-and-avoid-common-issues

https://www.fluentcpp.com/2021/01/01/include-what-you-use/

https://include-what-you-use.org/

【讨论】:

  • 我假设让 50 个文件都单独包含 iostream 是多余的,因为根据向我解释的方式,编译器或多或少地将头文件代码复制+粘贴到据说包含的任何位置
  • @Shirb 因为#ifndef/#define/#endif 的事情,文件被跳过。现代编译器足够聪明,可以实现这一点,甚至不用费心处理文件。
【解决方案2】:

我不太确定。您可能会错过的一件简单的事情是确保每个标题只包含一次。最有可能的是,您在“a.h”或“b.h”文件中遗漏了它。您应该在每个头文件中都这样做以避免循环依赖,包括“c.h.”。你可以这样做

#pragma once

或者

#ifndef _INCL_GUARD
#define _INCL_GUARD
#endif

看: Why are #ifndef and #define used in C++ header files? https://learn.microsoft.com/en-us/cpp/preprocessor/once?view=msvc-170

【讨论】:

  • 我正在使用 CLion,它会在创建新的头文件时自动生成 #ifndef #define #endif 语句
  • _INCL_GUARD 是 C++ 中的保留名称 - 不要在您自己的代码中使用以下划线和大写字母开头的名称。
猜你喜欢
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 2013-07-13
相关资源
最近更新 更多