问题标签 [include-guards]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
821 浏览

c++ - #import 是 C++11 标准的一部分吗?

我试图找出在跨平台 C++11 库中使用#import(而不是包含防护)是否安全?#include

我在 SO 和其他地方找到的文章似乎表明 #import 被提议包含在 C++11 标准中,但从大约 2012 年左右的答案来看,它似乎仍然是 Microsoft 和 GCC 特定的扩展,而 import 不是接受的标准。

0 投票
1 回答
135 浏览

c++ - Header Guard 问题 - 被活吞

我完全束手无策:我无法弄清楚我的依赖问题是如何出现的。我已经阅读了无数的帖子和博客,并且多次修改我的代码,以至于我什至不记得什么几乎可以工作,什么没有。我不仅不断收到重新定义错误,而且还收到类未定义错误。我重新设计了标题保护并删除了一些错误,只是为了找到其他错误。我不知何故把一切都归结为一个错误,但在试图修复它时,即使它也坏了。

你能帮我找出问题吗?

卡片.cpp

卡.h

conception.h—— 这是一个“超级类”,一切都源自它

概念.cpp

game.cpp—— 截至本代码,这是一个不完整的类

游戏.h

列表.cpp

列表.h

播放器.cpp

播放器.h

0 投票
4 回答
497 浏览

c++ - 只在接口中包含头文件,而不是在实现中

我的头文件如下所示:

我的实现文件如下所示:

我的立场是我没有#include stringvector在实现文件中没有,因为它们已经在接口中声明,并且#include在实现文件中添加它们充其量是多余的,更糟的是有害**。

当然,A的实现将在界面中不可见的#include所有实现细节。

我的问题:我是对的吗?这种做法会对我的代码产生负面影响吗?

** 这有点牵强,但是包含的数量(以及使用的包含保护)会影响非常大的项目的编译速度;这篇文章很有趣

0 投票
4 回答
4465 浏览

c++ - C++ 包含标准头的保护

我想知道是否/什么包括对文件的保护,如windows.h, math.h, iostream, stdio... 等。

因为我在不同的文件中多次包含这些标题。这些文件是否已经内置了保护程序或者是否定义了定义?

我只是想知道这种事情的标准是什么。

0 投票
4 回答
143 浏览

c++ - C ++标头保护对象和用法?

我习惯于在我的对象周围放置头部防护装置,例如:

但我得到了他们也做的代码:

对于每个包括。估计这样比较好。为什么?这对物体周围的警卫来说是多余的吗?

0 投票
3 回答
21339 浏览

c++ - 为什么即使我没有#include 仍然可以使用 std::max 和 std::min?

据我所知,minandmax函数定义在<algorithm>.

如果我没有告诉预处理器包含<algorithm>为什么代码仍然有效?

0 投票
1 回答
685 浏览

include - 如何从 Nim 的导入失败中恢复?

Nim中,我可以编写以下代码来导入外部模块:

只要我有该模块,它就可以正常工作,但是对于可能下载代码但没有安装模块的人来说,编译将失败,并显示一条用户友好的消息:

有什么方法可以环绕它,import以便我可以像异常一样捕获它并执行类似于when语句的替代代码分支?我希望找到一些importable类似宏或我可以使用的东西:

事实上,我想让一些模块成为可选模块,而不是一个简单的错误消息,这样编译仍然可以继续进行,也许功能会减少。这可能吗?

解决方案编辑:根据这里的答案是我的版本如何解决这个问题,首先你需要一个moduleChecker具有以下来源的二进制文件:

然后,让这个命令可用,可以使用以下宏:

不幸的是,必须生成一个单独的进程,不仅用于外部编译,而且还需要另一个进程来生成临时文件以进行检查,因为staticWrite当前版本中没有在编译时生成文件。

0 投票
2 回答
1071 浏览

c - 在 .c 文件中包含警卫的目的

我经常在 C 源文件的开头看到这样的代码

我对此的目的感到困惑..?

我知道头文件中是否定义了包含保护,但是

  1. 这些在源文件中包含警卫的目的是什么?和

  2. 为什么 function2() 在包含守卫之外定义?

0 投票
2 回答
486 浏览

c - 为什么不在头文件中声明结构?这不会使包含守卫变得不必要吗?

我最近意识到,虽然在给定的翻译单元中多次定义某些东西是非法的,但随意多次声明事物(函数、变量、结构)是完全合法的。我的印象是包含守卫的目的是防止重复声明。

事实上,它们的目的似乎是为了防止重复定义然而,由于函数和变量定义正确地属于 .c 文件而不是 .h 文件,并且只有 .h 文件是# include'd,这似乎意味着只有结构和联合存在问题(因为我们通常在 . h 文件,而不仅仅是声明它们)。(甚至维基百科页面上的示例包含警卫使用结构定义)。

我的问题是:为什么在头文件中定义结构如此普遍?难道我们不能在头文件中声明它们,然后将它们的定义放在 .c 文件中,然后完全不需要包含警卫,因为重复声明是可以的?

如果我不得不猜测,那是因为如果我们这样做了,那么包含此类头文件的源文件唯一能够这样做的就是创建指向结构的指针,因为它们包含的字段的定义在其他一些 .c 文件中. 那准确吗?

0 投票
5 回答
2286 浏览

c - 多重包含优化

我试图了解多重包含优化如何与 gcc 一起工作。最近,我一直在阅读很多代码,其中包含标准头文件的保护,例如

我试图弄清楚这个结构是否有任何好处。

这是我写的一个例子来更好地理解这一点。

header1.h

header2.h

硬盘驱动器

请注意,两者都header1.h使用header2.h相同的包含防护。正如预期的那样,该程序输出Aheader1.h 中定义的值;header2.h 被跳过,因为它使用相同的包含保护。

这就是我想要理解的

  • 在解析 header2.h 时,预处理器会在什么时候跳过这个文件?我的理解是它#if在第 1 行的指令之后立即跳过该文件,即它不必等待匹配的#endif. 它是否正确?
  • 我可以在上面的示例中添加什么来演示它是如何工作的?

编辑:谢谢大家的回答。这现在开始变得更有意义了。一个后续问题。链接到这篇文章第一行的页面有以下文字

预处理器注意到这样的头文件,因此如果头文件出现在随后的#include 指令中并且定义了 FOO,那么它会被忽略并且它不会预处理甚至第二次重新打开文件。这称为多重包含优化。

如果我理解正确,这意味着任何头文件都只读取一次,即使它在给定的编译过程中被多次包含。因此,应用程序代码或头文件中的额外包含保护没有任何好处。