为什么在头文件中声明和在文件中定义会产生多个定义错误? 我对C++编程很陌生。我对JAVA有了一些更好的了解。所以我用HACKRANKE来学习C++。为了跟踪每个程序,我开始为每个程序或挑战使用头文件和程序文件。所以我试着做hackerrank练习输入和输出 (). 因此,我试图以这种方式实施我的计划

为什么在头文件中声明和在文件中定义会产生多个定义错误? 我对C++编程很陌生。我对JAVA有了一些更好的了解。所以我用HACKRANKE来学习C++。为了跟踪每个程序,我开始为每个程序或挑战使用头文件和程序文件。所以我试着做hackerrank练习输入和输出 (). 因此,我试图以这种方式实施我的计划,c++,linker-errors,header-files,multiple-definition-error,C++,Linker Errors,Header Files,Multiple Definition Error,输入输出.h #ifndef INPUTANDOUTPUT_H_ #define INPUTANDOUTPUT_H_ int arr[3]; int m; int InputAndOutput(); #endif inputadoutput.cpp #include "InputAndOutput.h" #include<iostream> #include<cmath> #include<cstdio> int InputAndOutput(){

输入输出.h

 #ifndef INPUTANDOUTPUT_H_
 #define INPUTANDOUTPUT_H_

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

#endif
inputadoutput.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;
}
#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 ;
}
int arr[3];
int m;
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;
 }
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 ;
}

请解释一下这个错误是什么。BTW我使用Eclipse,它在编译时抛出错误。

< P>首先解释最简单的问题,让我们来看看“INTARR(3);”

对于该变量声明,它在inputadoutput.h头中声明和实现

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

若要声明变量(可在其他文件中使用),请使用:

输入输出.h

extern int arr[3];
extern int m;
#include <array>
int32_t InputAndOutput(std::array<int32_t, 3>& arr, int32_t& m);
inputadoutput.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;
}
#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 ;
}
int arr[3];
int m;
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;
 }
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 ;
}
这告诉编译器有两个变量arr和m,它们在.h文件中声明,但在外部文件中使用extern关键字实现

请注意,你在你的问题中所发布的代码只是C++文件中的C。

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

这样,如果您要删除全局变量并使用C++ STL容器,您将得到以下内容:

输入输出.h

extern int arr[3];
extern int m;
#include <array>
int32_t InputAndOutput(std::array<int32_t, 3>& arr, int32_t& m);
#包括


<>和,也查一下萨特的网站,关于几乎总是自动在

解释最简单的问题,先看看“INTARR [3 ];

对于该变量声明,它在inputadoutput.h头中声明和实现

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

若要声明变量(可在其他文件中使用),请使用:

输入输出.h

extern int arr[3];
extern int m;
#include <array>
int32_t InputAndOutput(std::array<int32_t, 3>& arr, int32_t& m);
inputadoutput.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;
}
#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 ;
}
int arr[3];
int m;
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;
 }
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 ;
}
这告诉编译器有两个变量arr和m,它们在.h文件中声明,但在外部文件中使用extern关键字实现

请注意,你在你的问题中所发布的代码只是C++文件中的C。

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

这样,如果您要删除全局变量并使用C++ STL容器,您将得到以下内容:

输入输出.h

extern int arr[3];
extern int m;
#include <array>
int32_t InputAndOutput(std::array<int32_t, 3>& arr, int32_t& m);
#包括

另外,还可以查看Herb Sutter的网站,关于几乎总是自动的