问题标签 [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 投票
5 回答
177 浏览

c++ - 包含头文件的困惑

当我包含一个头文件时,可以说,

进入,

我被告知的是,当 mycpp1.cpp 包含 myheader.h 时,MY_HEADER_H会被定义,因此任何再次包含它的尝试都会导致错误。

现在,如果我想将它包含在 mycpp2.cpp 中。

它会被包含,还是在第一次包含时使用相同的声明?

0 投票
3 回答
1791 浏览

c++ - C++ 包含守卫

所以我知道如何使用标准在我自己的头文件中放置一个包含保护

现在,我的问题是关于包括不属于我自己的库。将是一个很好的例子。我有一个需要使用字符串的头文件,所以我执行以下操作

foo.h

现在,如果我有另一个名为 .. 的头文件,可以说,bar.h它也需要使用<string>,我如何防止多个包含?STL 是否已经包含防护装置?

0 投票
5 回答
307 浏览

c++ - 为什么要将整个标头内容放在保护令牌中?

C 和 C++ 区分声明和定义。

您可以多次声明一个符号,但您只能定义一次。通过学习这一点,我有一个想法,将声明放在守卫之外,而将定义放在守卫内部:

通过这种方式,我可以包含我想要的任何顺序的标题。并且可能循环依赖不会成为问题。

那么,如果我们可以将声明放在外面,为什么还要用保护令牌来保护整个标头呢?

我的理由如下:

当两个标题以某种方式相互引用时,您可能经常遇到问题。您通常会收到未声明的符号错误,您的第一反应是包含必要的标头。但是,当您的两个标头碰巧相互包含时,您会得到一些神秘的错误。

啊:

bh

当在 b.cpp 中包含 bh 时,您会在 ah 中得到一个错误,即 B 未声明但包含标头。(这是一个wtf时刻。)

这是因为头卫不会嵌套:

如果您将声明放在守卫之外,则可以防止这种情况:

这里没问题。

更新:将标头包含在警卫中(对不起,这是一个错误)。

0 投票
2 回答
24467 浏览

c - C中“ifndef”和“if!defined”的区别?

我已经 在#ifndef ABC#if !defined (ABC)一个 C 源文件中看到过。

它们之间有细微的区别吗?(如果是风格问题,为什么有人会在同一个文件中使用它们)

0 投票
1 回答
261 浏览

r - 如何防止 source() R 代码被多次包含?

我有很多 R 源文件。例如,在A.RC.R文件中,B.R都是通过source(). 现在我想同时使用 和 中的功能A.RC.R如何避免B.R重复采购?在 C/C++ 中是否有类似的包含保护机制?

0 投票
1 回答
2632 浏览

c++ - '-' 标记之前的预期 unqualified-id

我遇到了一个奇怪的情况。我的理解是,如果我将#ifndef #define #endif 标志放在所有.h 文件中,则包含头文件的顺序并不重要。

老代码啊

cc

以上代码运行良好。

现在我添加了一个新的标题 bh

bh

新的.cc

上面的a.cc编译好了。但是,如果我将 a.cc 更改为

新的 a.cc 版本 2

编译失败并出现错误:“-”标记之前的预期 unqualified-id。

抱歉,我无法在一个小示例中重现相同的错误。编译错误导致了一个大项目。如果我在上面创建的一个小例子中进行测试。它已编译,但如果我切换回项目。#include 指令顺序确实很重要。我不知道这个问题可能发生在哪里。任何人都可以给我一个线索会很有帮助。提前致谢

[已解决] 我自己解决了这个问题。然而,我认为可能还有其他人也坚持下去。导致问题的原因如下

在 test.cc 中

它编译,而如果你交换这两行

正如我所说,它在“-”标记之前使用错误预期的 unqualified-id 进行编译。

0 投票
4 回答
13618 浏览

c++ - C++ 中包含保护的#ifndef 语法

我目前正在准备 CS 课程的期末考试,我遇到了一个关于 C++ #ifndef 语法的小问题(也许是大问题?)。

在将 #infndef 用作 #include 保护时,我已经查看了它的语法,并且网络上的大多数似乎都说:

但是我班的教程幻灯片显示的示例如下:

我想知道两者之间的区别是什么(如果有的话)。考试很可能会要求我写一个#include 守卫,我知道传统的智慧就是按照教授/导师所说的去做,但是如果在编译过程中存在差异,我想知道。

0 投票
3 回答
252 浏览

c - 为什么不允许多次定义 C 结构的成员?

在我看来,C 中反对多次声明结构成员的规则似乎是需要包含守卫的主要原因。如果我们在“header.h”中有以下内容:

和文件“ah”#include 的 header.h,那么我们不能同时包含“ah”和“header.h”,因为 struct s 被定义了两次。

我的问题是,这样做有什么问题?为什么不允许多个相同的结构定义?这将消除对包含保护的需求,并大量清理 C 头文件。

C 中的规则是允许多个声明,但只能定义一个。由于某种原因,指定结构的成员称为“定义”,即使它没有定义变量或函数。

0 投票
2 回答
616 浏览

c++ - “#pragma once”是否有可能导致错误?

我所有的头文件都使用包含保护pragma once

我知道pragma once不是标准的,并且在编译器中可能不一样,但是它是否有可能导致错误?以某种方式测试它是否首先可用会更好吗?

我想提供一次编译指示作为可能加速编译并避免名称冲突的选项,同时仍然提供跨编译器的兼容性。

0 投票
2 回答
1684 浏览

c - 标准标头/库中是否包含保护?

事实上,如果我包含stdlib.h到我的程序的每个文件中并且我没有得到重新定义错误。所以,答案是肯定的。正确的?

我正在阅读libxml2源代码,HTMLparser.c其中有这一部分:

我的问题是:为什么include guards在这里使用?