【问题标题】:Mysterious "multiple definition" error [closed]神秘的“多重定义”错误[关闭]
【发布时间】:2015-05-19 06:37:02
【问题描述】:

https://gist.github.com/protectivetoast83/25301772cbc6f13e6e07

我搬家了

#include "time.h"

objColPhys.cpp的第2行(继承自objects.h)到objects.h的第3行

time.h 不包含在项目的其他任何地方,但现在我在 time.h

的第 9 行遇到多重定义错误
In function `Z7runTimev':
multiple definition of `runTime()'
first defined here

另外,我不知道那个 Z7runTimev 是关于什么的,因为函数被声明为 runTime()

发生了什么,我该如何解决?

【问题讨论】:

标签: c++ sdl sdl-2


【解决方案1】:

您错过了包含文件中的所有包含保护(如 cmets 中所述,为了清楚起见,我将在此处公开它)。

当您在多个文件中包含相同的头文件时,预处理器只是将#include 指令替换为包含文件中的所有代码。因此,嵌套包含可能导致多次重新定义。

只需将以下代码添加到包含文件中即可解决此问题:

#ifndef _TIME_H
#define _TIME_H

// Header file code here

#endif

这保证文件只包含一次(由于#ifndef 指令,预处理器在其余时间跳过头文件代码)。为了安全起见,您需要将包含保护添加到所有包含文件中,当然要使用相应的命名。

现在许多编译器都支持指令#pragma once,您需要在文件开头添加它,并且避免了在文件开头使用丑陋的#ifdefs 的麻烦(当然,那个孤独的@ 987654326@最后)

【讨论】:

  • 非常感谢!我会将这些添加到我的文件中。由于 time.h 文件仅包含一次,因此我对为什么首先收到此错误感到有些困惑。 编辑:我在 time.h 上尝试了两个包含守卫,但我仍然在同一行上遇到完全相同的错误。
  • 您需要在每个头文件中添加它,也在objects.h中:#ifndef _OBJECTS_H
  • 我为项目中的每个标头添加了标头保护,但对于 time.h 中声明的所有内容(并且仅在 time.h 中),我仍然遇到多个定义错误。我尝试更改该文件中项目的名称以防万一,但我仍然在所有项目上遇到多个定义错误。
  • 我想通了。看起来标头守卫不喜欢定义,或者显然不喜欢变量的声明。我从 time.h 中删除了这些并创建了 time.cpp 以将它们放入并编译所有内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 2017-04-20
  • 2014-06-07
相关资源
最近更新 更多