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

c - 有什么理由将 header-guard 定义为 1?

偶尔我会观察到这样的标头守卫:

但我是这样学习的:

是对某些编译器的旧遗物的定义1吗?现在它有什么害处吗?现在的方法是什么?

0 投票
2 回答
1319 浏览

cmake - (交叉编译)平台文件是否需要包含保护?

我正在为 VxWorks 编写一个交叉编译工具链文件。因为 cmake 是一个未知的系统,所以也有写平台文件(那些在../Modules/Platform)。

到目前为止,除了我的工具链文件之外,我还编写了这些平台文件:

  • VxWorks.cmake(VxWorks 操作系统设置)
  • VxWorks-gcc.cmake(WindRiver (Gnu) 编译器设置)
  • VxWorks- gcc- [CPU] .cmake(CPU 特定设置,是工具链文件中指定的处理器)

目前,我的文件一切正常。

但是一些默认平台文件包含一个包含保护/包含阻止程序,如下所示:

(来自Modules/Platform/Windows-GNU.cmake:)

所以我想知道:我是否也必须插入这样的后卫?什么时候插入它们是个好主意?

0 投票
2 回答
10028 浏览

c - 在 C 中包含守卫约定

设置包含防护的常规方法是什么?我通常将它们写为(例如.h):

下划线约定重要吗?当我用谷歌搜索时,我看到了相互矛盾的信息。_EXAMPLE_H_甚至必须匹配标题的名称吗?

0 投票
3 回答
130 浏览

c - ifndef 是否总是适用于使用空替换列表定义的类对象宏

头文件中的包含保护通常用于保护代码部分免受双重包含:

包含守卫通常依赖于这样的期望,即如果已经定义了类似对象的宏,#ifndef则不会包含块内的行——从而避免双重包含。

我注意到#define许多包含标题的行都有空的替换列表。C99 标准是否保证用空替换列表定义的类对象宏将被视为“定义” #ifndef

在描述 的语法时#define,C99 标准似乎暗示第 6.10.3 节第 9 段中需要替换列表:

形式的预处理指令

# 定义 标识符替换列表换行

定义了一个类似对象的宏,它使宏名称的每个后续实例都被构成指令其余部分的预处理标记的替换列表替换。然后重新扫描替换列表以获取更多宏名称,如下所示。

这是否意味着包含标题应该采用以下形式:#define FOOBAR_H 1

0 投票
5 回答
3477 浏览

c - 为什么头文件中的全局变量会导致链接错误?

即使我在头文件中放置了包含保护,我总是会收到以下错误。

这里是 .h 头文件、.c 文件和 main.c

主程序

握手.h

握手.c

但是,如果我从头文件中删除全局变量,这些代码编译成功。
我不明白为什么。有人可以解释为什么吗?先感谢您。

0 投票
2 回答
184 浏览

c - C 内核库包含和膨胀

我是新手,所以我提前感谢您的帮助和耐心。我用 C 写了一个程序,如下所示:

arpsend 和 arprec 文件使用许多相同的内核库函数和定义。我注意到,当我编写 arprec.c 代码时,我的程序大小猛增。它比我的代码应该有的膨胀得多。这使我得出结论,arpsend.c 和 arprec.c 都在各自的 .c 文件中链接了它们自己需要的 linux 库代码。链接对于项目来说是多余的,但对于每个 .c 文件都是必需的。

我的问题如下:

  1. 如果我添加到项目中的每个 .c 文件都会因为内核和标准库冗余而像这样膨胀,那么每个程序不会变得不必要地膨胀吗?我的示例中的膨胀可能是微不足道的(~12k),但我只能想象如果我需要在几个不同的 .c 文件中使用一些图形库会发生的那种膨胀。

  2. 有没有办法避免这种情况?

  3. 推荐的解决方案是将使用相同内核代码的所有函数简单地保存在一个文件中吗?

  4. 如果#3 是正确的,这难道不会破坏保持代码整洁的意义吗?它是 C,所以它不是真正的 OOP,但我想将我的代码展开,以便我可以轻松地看到项目的构成。

如果这是多余的,我深表歉意。我在这里浏览了几个小时的论坛。我找不到我的确切问题。再次感谢你的帮助

0 投票
4 回答
130 浏览

c++ - 为什么包括警卫对我没有影响?我错过了什么吗?

主游戏.h

主游戏.cpp

主文件

游戏配置.h

编译时出现链接器错误...

但我不明白为什么...... GameConfig 只有两个包含 - 一个在MainGame.cpp,第二个在main.cpp。那些不应该越过。即使他们越过了,那么#ifndef GameConfig_h#define GameConfig_h#endif GameConfig又是为了什么?

我使用 VC++ 2010 速成版

0 投票
3 回答
125 浏览

c - 将同一文件包含在 2 个文件中然后将它们包含在另一个文件中时出错(在 c 中)

我在 C 中有一个问题,我不知道如何解决。假设我有 4 个 c 文件,ac;公元前; 抄送; dc,每一个都有一个.h文件:啊;bh; ch; dh,当然也包括在内。我想做以下事情:

啊将包含:

bh 将包含:

和 ch 还将包含:

在 dh 我定义了一个结构,例如, dh 的内容将是:

问题是我得到错误(当我编译文件时):

我明白为什么会这样(因为 preproccesor 两次导入定义),但我该如何解决呢?我需要包含这样的方式(因为我当然有更多文件,这只是一个例子)。我能做些什么?

注意:我的makefile是:

我认为没关系..它对我有用。感谢您的帮助。

0 投票
2 回答
885 浏览

c - 包括 Guard 仍然插入全局变量

我在项目 (Visual Studio) 中有 3 个*.c文件 (file1.cfile2.c)file3.c和 1 个*.h文件 ( file3.h)。




当我在 VS 中构建解决方案时,它给出的错误为"_gintVariable already defined in file1.obj".

我确实检查了预处理器的输出,所有 *.c 文件中都包含了 gintVariable,即使我已经包含了包含防护。

我在做什么错误?

0 投票
2 回答
870 浏览

c++ - 前向声明?,包括守卫?,还是别的什么?

我有一个名为 Token 的父类

我有两个子类, ErrorToken 和 EndToken这些类中的每一个都需要能够创建另一个的对象,并通过函数调用返回它。每个都有自己单独的头类。

所以,ErrorToken 需要能够创建新的 EndToken 对象并返回,而 EndToken 需要能够创建新的 ErrorToken 对象并返回。

成功做到这一点的最佳方法是什么?我希望它尽可能兼容交叉编译器,所以我不想使用 pragma 一次。(但这基本上就是我正在寻找的)。

理想情况下,我希望能够做这样的事情......

但这似乎永远行不通(我的猜测是那是错误的?有人可以帮我理解为什么吗?)。

我对前向声明的理解是它只适用于函数签名和指针(对吗?),所以我认为这不适用于我的情况,因为我需要它能够运行构造函数......或者确实编译器只需要知道构造函数在那一刻退出?