【问题标题】:Global variable error C++全局变量错误 C++
【发布时间】:2016-11-27 05:58:39
【问题描述】:

我在大型操作系统作业中遇到了一个不知道如何解决的错误。我得到的错误是“架构 x86_64 的 42 个重复符号”。我认为这与我的全局变量文件“global.h”有关。我使用了 3 个全局变量,并且“global.h”包含在一个名为“PageReplacementAlgorithm.cpp”的抽象类中。我有大约 6 个类派生自 PageReplacementAlgorithm 类,它们利用这些全局变量。我认为当我在“main.cpp”中包含所有这些派生类时问题就来了,因为我需要为它们创建新实例。如何修复全局变量的实现?

全球.h

#include "PageTableEntry.h"
using namespace std;
#ifndef Global_H
#define Global_H

extern PageTableEntry pageTable[64];
extern int* frameTable;
extern int framesCount;

#endif

PageReplacementAlgorithm.h

#include "Global.h"
using namespace std;

#ifndef PageReplacementAlgorithm_H
#define PageReplacementAlgorithm_H

class PageReplacementAlgorithm {
public:
   virtual int selectFrame(PageTableEntry &p) = 0;
};

#endif

示例派生类 (FIFO)

include "PageReplacementAlgorithm.h"
using namespace std;

#ifndef FIFO_H
#define FIFO_H

class FIFO : public PageReplacementAlgorithm {
public:
    FIFO();
    int selectFrame(PageTableEntry &p);
private:
     int entries;
};

#endif

Main.cpp

 #include "Aging.cpp"
 #include "Clock.cpp"
 #include "FIFO.cpp"
 #include "MMU.cpp"
 #include "NRU.cpp"
 #include "Random.cpp"
 #include "SecondChance.cpp"

【问题讨论】:

  • 太棒了!你的来源在哪里? (将其包含在问题中)。
  • 请发布您的源代码... :)
  • 谢谢,刚刚发布了 :)
  • 我只是重读了部分错误输出,它对于每个派生类的方法都有“重复符号 FIFO::selectFrame(PageTableEntry&)”。嗯,可能不是全局变量?
  • @Matrix21,正确!你是如何构建你的源的?您的编译器能否抓住所有源?所以你得到FIFO 一次来自Main.cpp 和一次来自FIFO.cpp!?

标签: c++ operating-system global-variables


【解决方案1】:

为什么要在 main.cpp 中包含所有 cpp 文件?我认为它们包含相同的包含,对吗?即使你在那里有警卫,你也会在警卫之前进行额外的包含,这可能是问题的根源。 main.cpp 可以只包含 main() 函数和类的导入头,不需要包含 cpp。

此外,您可以将头文件修改为如下所示(为了极度安全):

#ifndef PageReplacementAlgorithm_H
#define PageReplacementAlgorithm_H
#include "Global.h"
using namespace std;

...
#endif

我建议你看答案C++ #include guards

【讨论】:

  • 这是一种古老的技术,被称为(难以想象)Single Compilation Unit
  • 谢谢!!它现在正在编译,我将阅读“单一编译单元”以及@StoryTeller。还是 C++ 的新手。
  • @StoryTeller 辉煌。以前从未听说过这个! Matrix21 你可能最好坚持使用更正常的方式来构建代码?
  • @StoryTeller 我认为,您可以使用将 cpp 文件包含到标头中以进行模板实现。即使这似乎有点……对我来说很乱。 :-)
  • @StoryTeller 不同架构的不同实现对我来说听起来很合理。元编程对我来说听起来很神奇。 :-) 感谢分享!
【解决方案2】:

如果你摆脱#include "(anything).cpp,事情应该会更好。当您构建项目或运行编译器时,例如g++ main.cpp foo.cpp,那时那些.cpp 文件将被构建并链接到您的程序中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-13
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多