【问题标题】:ifndef isn't working; I have a header file included twice [duplicate]ifndef 不工作;我有一个包含两次的头文件[重复]
【发布时间】:2020-03-30 04:26:55
【问题描述】:

我的 Ifndef 不工作。我在两者中都包含两次 MapData.h:Generate.cpp 和 Risky Strats.cpp

地图数据.h:

#ifndef MAPDATA
#define MAPDATA
#include <iostream>
#include <vector>
class bases {
public:
    int x;
    int y;
};

class field {
public:
    std::vector <bases> map;
};
field battleground;
#endif //MAPDATA

生成.cpp:

#include <stdlib.h>//Randomness
#include <time.h>//time
#include <math.h>
#include "MapData.h"

Risky Strats.cpp:

#include <SFML/Graphics.hpp>
#include "MapData.h"

我不断收到同样的错误: 类场战场" (?battleground@@3Vfield@@A) 已在 Generate.obj 中定义

【问题讨论】:

标签: c++ ifndef


【解决方案1】:

“ifdef 之舞”会阻止您在一个 .cpp 中多次包含相同的 .h。每个 .cpp 文件只包含一次,但将其包含在两个不同的 .cpp 文件中,这意味着这两个 .cpp 文件都具有全局变量 battleground

您可以extern .h 中的变量声明并将定义放入 .cpp 文件(或 MapData.cpp)之一,但我首先要质疑是否有一个全局变量是正确的设计选择第一名。

【讨论】:

    【解决方案2】:

    这不是包含保护的工作方式——它们防止在单个翻译单元中多次包含同一个头文件,而不是跨多个翻译单元。

    正如您现在所拥有的,您的每个翻译单元都会获得一个名为 battleground 的全局对象,然后在链接时发生冲突。

    如果实际上您想要一个全局field battleground,则需要在标题中将extern 添加到field battleground;,然后将定义field battleground; 放入您的.cpp 文件之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-05
      • 2022-01-20
      • 2020-02-09
      • 1970-01-01
      • 1970-01-01
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多