为什么在头文件中声明并在文件中定义会出现多重定义错误?
Why does Declaring in header file and defining in file gives 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
请解释一下这有什么问题notation.BTW我正在使用 eclipse,它在编译时抛出错误。
先把最简单的问题解释清楚,再来看看"int arr[3];"
对于那个变量声明,在InputAndOutput.hheader.
中声明和实现
main.cpp 和 InputAndOutput.cpp 都包含 header 文件,因此实现了两次变量。
要声明变量,使其可以在其他文件中使用,您可以使用:
InputAndOutput.h
extern int arr[3];
extern int m;
InputAndOutput.cpp
int arr[3];
int m;
这告诉编译器有 2 个变量,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++,你应该学习现代 C++ 而不是 C++98。
我建议您阅读 https://github.com/isocpp/CppCoreGuidelines
此外,还请查看 Herb Sutter 的网站,关于 Almost-Always-Auto https://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/
我是 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
请解释一下这有什么问题notation.BTW我正在使用 eclipse,它在编译时抛出错误。
先把最简单的问题解释清楚,再来看看"int arr[3];"
对于那个变量声明,在InputAndOutput.hheader.
中声明和实现main.cpp 和 InputAndOutput.cpp 都包含 header 文件,因此实现了两次变量。
要声明变量,使其可以在其他文件中使用,您可以使用:
InputAndOutput.h
extern int arr[3];
extern int m;
InputAndOutput.cpp
int arr[3];
int m;
这告诉编译器有 2 个变量,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++,你应该学习现代 C++ 而不是 C++98。
我建议您阅读 https://github.com/isocpp/CppCoreGuidelines
此外,还请查看 Herb Sutter 的网站,关于 Almost-Always-Auto https://herbsutter.com/2013/08/12/gotw-94-solution-aaa-style-almost-always-auto/