为什么在头文件中声明和在文件中定义会产生多个定义错误?

时间:2016-11-13 13:27:51

标签: c++ linker-errors header-files multiple-definition-error

我是c ++编程的新手。我对JAVA有了更好的了解。所以使用hackerrank我正在尝试学习C ++。为了跟踪每个程序一个单独的实体,我开始为每个程序或挑战使用头文件和程序文件。所以我正在尝试进行hackerrank练习输入和输出 (https://www.hackerrank.com/challenges/cpp-input-and-output)。所以我尝试以这种方式实现我的程序;

InputAndOuput.h

 #ifndef INPUTANDOUTPUT_H_
 #define INPUTANDOUTPUT_H_

int arr[3];
int m;
int InputAndOutput();

#endif

InputAndOutput.cpp

#include "InputAndOutput.h"
#include<iostream>
#include<cmath>
#include<cstdio>

int InputAndOutput(){
     int arr[3];
     for(int i1 = 0; i1 < 3 ; i1++)
        std::cin >> arr[i1];
     for(int i = 0; i < 3 ; i++)
       m = m + arr[i];
     return m;
}

的main.cpp

#include<iostream>
//#include<day1DataTypes>
#include<cmath>
#include<cstdio>
//#include "day1DataTypes.h"
#include "InputAndOutput.h"

int main()
{
    int k = InputAndOutput();   \\the error persists even the whole block is commented
    std::cout << k << std::endl ;
}

这个出现以下错误;

Description Resource    Path    Location    Type
first defined here  Hackerrank      line 6  C/C++ Problem
first defined here  Hackerrank      line 8  C/C++ Problem
make: *** [Hackerrank] Error 1  Hackerrank          C/C++ Problem
multiple definition of `arr'    Main.cpp    /Hackerrank line 9  C/C++ Problem
multiple definition of `m'  Main.cpp    /Hackerrank line 12 C/C++ Problem

请解释一下这个表示法有什么问题.BTW我正在使用eclipse,它在编译时抛出错误。

1 个答案:

答案 0 :(得分:2)

首先解释最简单的问题,让我们来看看“int arr [3];”

对于该变量声明,它在InputAndOutput.h头中声明并实现。

main.cpp和InputAndOutput.cpp都包含头文件,因此实现了两次变量。

要声明变量,可以在其他文件中使用它,您可以使用:

<强> InputAndOutput.h

extern int arr[3];
extern int m;

<强> InputAndOutput.cpp

int arr[3];
int m;

这告诉编译器有两个变量arr和m,它们在.h文件中声明,但是使用extern关键字在外部文件中实现。

请注意,您在问题中发布的代码仅仅是C ++文件中的C语言。

在C ++中,不鼓励使用全局变量来存储数据。

因此,如果您要删除全局变量并使用c ++ stl容器,那么您将拥有以下内容:

<强> InputAndOutput.h

#include <array>
int32_t InputAndOutput(std::array<int32_t, 3>& arr, int32_t& m);

<强> InputAndOutput.cpp

int32_t InputAndOutput(std::array<int32_t, 3>& arr, int32_t& m)
{    
     for(auto i1 = 0; i1 < 3 ; i1++)
         std::cin >> arr[i1];
     for(auto i = 0; i < 3 ; i++)
         m = m + arr[i];
     return m;
 }

<强>的main.cpp

int main()
{
    auto arr = std::array<int32_t, 3>{0,0,0};
    auto m = 0;
    const auto k = InputAndOutput(arr, m);
    std::cout << k << std::endl ;
}

现在,这应该解决你的大部分问题,但是,我没有在原始代码中看到你如何从std :: cin获取输入,因为你没有提示用户输入......和这导致了一个错误。

由于您正在学习C ++,因此您应该学习Modern C ++而不是C ++ 98。

我建议你阅读https://github.com/isocpp/CppCoreGuidelines

另外,请查看Herb Sutter的网站,关于https://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/

的Almost-Always-Auto