问题标签 [multiple-inclusions]

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 投票
9 回答
38664 浏览

c++ - 由于在多个 cpps 中包含相同的标头而导致重复的多个定义错误

因此,无论我做什么,我似乎都无法避免 Dev C++ 出现大量多重定义错误,因为我在同一个项目的多个源代码文件中包含了相同的头文件。我强烈希望避免将所有源代码转储到一个文件中,并且只包含一次标题,因为这会使我的文件非常长且难以管理。

本质上,这就是正在发生的事情:

示例 Cpp 文件(它们几乎都像这样):

请记住,我有大约 5 个包含这个头文件的 cpp 文件,每个文件都处理头文件中的不同类型的结构。在这个例子中,只有一个结构包含几个成员,而实际头文件中有大约 4-6 个不同的结构和更多的成员。我包含的所有文件都遵循与您在此示例中看到的相同的公式。

现在我明白标头保护只会阻止每个单独的 cpp 文件多次包含头文件。似乎正在发生的事情是,当编译器在每个 cpp 的开头读取包含时,它会重新定义头文件,这导致它吐出以下行和行:

我会为项目中几乎每个包含标头的 cpp 文件看到一组这样的文件。我已经尝试将结构和结构变量的定义移动到 cpp 文件中,但是其他 cpp 文件看不到它们或无法使用它们,这非常重要,因为我需要项目中的所有文件才能工作使用这些结构。

但是关于这个问题的最令人困惑的部分需要更多解释:

我在这个项目中设置这些多个文件的方式与我正在使用的书相同,John S. Harbour 的 All In One Game Programming。当我为书中的示例项目创建文件时,我遇到了完全相同的问题,这些文件要求同一项目中的多个 cpp 包含一个标头。

我可以逐字逐句地从书中输入它们,而且我的意思是逐字逐句......
我会得到项目中每个 cpp 的一系列 MD 错误。

如果我从本书附带的 CD 中加载示例项目,它会毫无问题地编译和运行,尽管文件本身以及项目选项在所有外观上都与我创建的相同。

如果我创建了自己的项目文件,并简单地从 CD 中添加示例项目的源文件和头文件,这也将编译和运行,尽管我发现它们和我的没有区别。

因此,我尝试制作自己的项目文件,然后创建空白的源文件和头文件并将它们添加到其中,然后通过从 CD 上它们要对应的文件中复制和粘贴它们的内容来填充它们(相同那些已经工作的)。果然,我会得到同样的东西……一行又一行的 MD 错误消息。

我完全感到困惑。我已经多次重复所有这些方法,并且确定我没有输入错误或错误复制代码。预制文件本身似乎有些东西。一些配置设置或其他我完全丢失的东西......这将导致它们正确编译,而我自己制作的文件不会。

0 投票
6 回答
46461 浏览

c - 为什么我的编译防护不能防止多个定义包含?

我有一个头文件 xh,它包含在多个 *.c 源文件中。这个头文件定义了一些结构变量。

我在头文件的开头放置了多个包含防止保护:

在构建时,我得到与多个定义相关的链接器错误。我明白这个问题。

  1. 不会像我一样在头文件顶部设置多重包含防止保护,防止头文件 xh 的多重包含,从而避免 xh 中存在的变量的多个定义?

  2. #pragma一次在这个特定的编译器上不起作用,那么解决方案是什么?有人将这个答案发布到了类似的问题上。它似乎对我不起作用。这个解决方案是如何工作的?

0 投票
4 回答
9747 浏览

c++ - 避免双重包含:预处理器指令与生成文件

我正在努力从 frankenstein 和一个文件的数千行程序转变为结构良好且组织良好的多文件程序。现在似乎很自然(天真)的是为我的三个文件制作一个包含头文件的三角:
file_1 包括 file_2,file_4
file_2 包括 file_3,file_4
file_3 包括 file_1 .... 等等
这些文件有变量,我在其他文件之间需要的方法、结构等。

当然,我遇到了双重包含错误。

我的问题:我应该通过在标头中使用预处理器指令(例如,完全在标头中包括结构、方法等)来避免这些问题,还是应该使用 makefile 进行编译(我听说它也可以用来解决这个问题- ——但我从来没有做过)?

0 投票
4 回答
57538 浏览

c - 使用 #ifdef 标头保护将 .h 文件与 .c 链接

我在链接 .h 和 .c 文件时遇到问题,我也阅读了一些关于这个问题的线程,所有这些都有点模糊,我仍然无法完全掌握它的概念,而且我有很多链接问题,假设我有 bc 和 bh,我将在 ac中使用,我很困惑是否同时包含 bh ac 和 bc 因为 bc 本身需要知道 bh 中定义的结构,我有一些函数,它的原型在 bh 中并被定义在 bc 中也使用 bh 中的结构,我不包括 bc 中的 bh cuz,因为我知道 bh 更像是 ac 的接口,它将使用 bc 中的函数。这里有一个更清晰的例子

.bh 文件

bc 文件

交流档案

在cygwin中执行命令:gcc bc ac -g

现在令人困惑的部分是,我有一个链接错误,其中在编译 bc 时它无法检测到 bh 中的结构和原型因为我所知道的是 bh 用于从 ac 链接 bc 但是当编译两个 .c 时似乎bc 找不到它的结构和原型,

为什么我没有在 bc 中包含 bh? 答案:因为据我所知,bh 已经包含在 ac 中,当我再次将它包含在 bc 中时,我将进行双重包含它不会工作,也许我仍然不知道如何使用它,如果你知道请随时讨论这个。

如果您对如何进行此操作有任何想法,请随时告诉我一些。

有一个#ifdef 指令,但我似乎不知道如何做到这一点。

注意:假设所有上述代码在语法上都是正确的,如果有任何拼写错误的单词请忽略,我只是在 .h 和 .c 之间的包含之后

0 投票
0 回答
114 浏览

c++ - 源文件中的冗余多头包含防止?

我找到了一个具有这种结构的项目:

对我来说,这似乎有点多余。

由于编译器不需要打开包含文件来实现它可以忽略它,因此在构建过程中可能会有小的性能改进。但我认为今天的编译器有更好的方法来优化这些东西。

我错了吗?

0 投票
3 回答
764 浏览

c++ - 哪些类型的头文件不应该受到多重包含的保护?

我阅读了 dcmtk 源代码,并在ofstdinc.h中找到了一条注释:

哪些类型的头文件应该受到多重包含的保护?

0 投票
0 回答
44 浏览

c++ - 多重包容。如果被允许会发生什么?

我是 C++ 新手,并且已经阅读了很多关于多个包含解决方案的文章。我遇到了 MACRO 和#pragma once方法,甚至自己尝试过它们来解决编译时错误。但是,他们都没有提到它们可能引起的问题。


如果允许多重包含会发生什么?

0 投票
0 回答
406 浏览

c++ - 两个相互引用的类:未知的覆盖说明符错误

我正在编写一个程序来安排医院的护士。我被两个类之间的包含循环困住了,但我不知道我在哪里出错了。有一个护士类有一个偏好配置文件的实例。此首选项配置文件有一个指向 Nurse 对象的指针。

护士班的标题:

PrefProfile 类的标题:

由于 PrefProfile 只包含一个指向护士对象的指针,我转发声明它而不是包含头文件。Nurse 类包括 PrefProfile 的标头。我在 Nurse 类的对象首选项处遇到以下错误:C3646 'pref':unknown override specifier。

我对 C++ 很陌生,我读到应该使用这种引用方法。有没有一种简单的方法可以避免这种包含循环?或者我在我的代码中遗漏了什么?

0 投票
2 回答
1117 浏览

c - 头文件的多重包含错误 - C

我有一个相对较小的项目,只有几个文件(.c 和 .h)。我一直在与多个包含错误作斗争(我认为)。因此,我创建了一个 master.h 头文件,其中包含所需的每个其他头文件。所有的头文件都有

保护以防止多重包含。我的每个文件都包含顶部的 master.h 文件。这就是我期望它如何工作的方式。

  1. 编译的第一个文件会看到 #include "master.h"
  2. 由于这是第一次处理此文件,__MASTER 尚未定义,因此它将处理该文件。
  3. 编译器将包含下一个头文件,类似地,它还没有被处理,所以编译器会处理它,然后它会被定义,并且不会再次被处理。
  4. 这对 master.h 中的所有头文件继续进行,直到所有文件都已被处理并定义为不再被处理。
  5. master.h 文件也是如此。一旦处理完成,由于有守卫,将不会再次处理。

这不应该防止多重包含吗?

所以这里是错误。


我已经编辑/删除了这篇文章中的一些信息,因为事实证明它是不相关的。似乎链接器遇到的“多重定义”问题不是由于实际的“多重定义”或任何变量的包含。相反,它似乎是由于同时声明和定义变量(在本例中为闪存中的 const)所致。一旦我将声明拆分为头文件,并将实际定义或分配拆分为 .c 文件,问题就消失了。以下是解决问题“变量”之一的示例。我现在将更加关注变量的声明和定义方面。使用的工具是 GCC。感谢您的所有评论。

0 投票
1 回答
134 浏览

java - 在 JAX-RS 应用程序中手动注册资源类有什么好处?

摘自 JEE 7 教程:

29.2.7.1 使用应用程序的子类配置 JAX-RS 应用程序

...

默认情况下,归档中的所有资源都将针对资源进行处理。覆盖 getClasses 方法以使用 JAX-RS 运行时手动注册应用程序中的资源类。

问题:

  1. 默认情况下,归档中的所有资源都会被处理,手动注册资源有什么好处?
  2. 据我了解,#1 有助于排除资源(如果错了,请纠正我)。如果我想排除一个资源,我只会评论@Path一个资源。无论哪种情况(手动注册和评论),都需要接触源代码。
  3. 将排除功能作为部署描述符条目不是更好吗?有这样的选择吗?