我遇到2D阵列重新定义错误

时间:2019-11-18 16:30:54

标签: c++ arrays redefinition

我的定义数组int mang[max][max]出现错误(实际上是3个相同的错误),我找不到任何可以正确解决的东西,所以希望有人能注意到我的问题并尽快为我提供帮助。 XD

在标题file array.h中,我有:

#include <iostream>
#define max 100
using namespace std;
int mang[max][max];

void NhapMang(int mang[][max], int hang, int cot); 
void XuatMang(int mang[][max], int hang, int cot);
int TinhTongPhanTu(int mang[][max], int hang, int cot);
int DemPhanTux(int mang[][max], int hang, int cot);

当我输入代码时,VS向我显示在.cpp文件中没有“发现任何问题”,但是当我调试代码时,该错误出现在头文件array.h中,并说:“ C2086 'int mang [100] [100]':重新定义”。 我认为我已经定义了两次或两次以上的 mang ,但是找不到其他的 mang 定义,也无法修复。 This is the capture of the error list。 我不知道我需要在项目中为您提供哪些部分来帮助修复该问题(而且我还认为,如果我将所有代码都复制粘贴到这里,我的文章将变得阅读起来很长:-(),所以如果您需要更多信息,请发表评论,我会给您。

好吧,我刚刚开始学习C ++已有3个月了,所以还有很多我还不了解的东西XD如果在解决问题的方式上我无法理解,请让我问你进一步了解。

希望您理解我的意思是XD(因为我不是母语人士)。谢谢您的阅读。

2 个答案:

答案 0 :(得分:2)

语言规则说:

  

[basic.def.odr]

     

每个程序都应在废弃的语句之外包含对该程序中奇特使用的每个非内联函数或变量的恰好一个定义;无需诊断。 ...

(其他规则中列出了一些例外情况,但没有例外适用于您的示例)


int mang[max][max];

这是变量的定义。该定义在头文件中。头文件通常被包含到多个翻译单元中。如果这样做,则已将变量的定义包括到了多个转换单元中。通过对非内联变量进行多个定义,您将违反上面引用的规则。

答案 1 :(得分:1)

此处的关键是预处理器是文本更改引擎。在您拥有hidden的每个文件中,插入<img>文本内容代替#include "array.h"

因此,如果您有多个包含array.h的文件,则每个文件都声明并定义#include(所有文件都使用相同的定义)。在编译期间这不是问题,因为每个文件都是单独编译的,但是它们每个都生成定义array.h的目标文件。

然后您尝试链接,链接器会看到数组的多个定义。

该解决方案与您在mang中用于功能的解决方案相同:您在标题中 declare 并定义 >在实施中(大概为mang)。

如何在不定义数组的情况下声明它?

好问题。我很高兴你问。您可以使用array.h这样的关键字来完成此操作。

array.cpp

extern

然后您在array.h中定义它:

// ...
#define max 100
extern int mang[max][max];      // <=== Look here (with extern)
// ...

顺便说一句,您可以使用预处理器来定义常量(例如array.cpp有一些缺点,在c ++中,通常最好使用编译时常量,例如

// ...
int mang[max][max];      // <== and compare to this (no extern)
// ..

#define max 100

(使用预处理器是对古代编译器不太聪明的一种保留。)