我正在尝试创建一个简单的程序,它使用良好的编程实践从C ++中获取用户的输入。它由Input.hpp,Input.cpp和main.cpp组成。即使我使用ifndef来防止这种情况,我仍然会收到多重定义错误。
Input.hpp
#ifndef Input_HPP
#define Input_HPP
#include <string>
#include <vector>
using namespace std;
vector<string> Get_Input();
vector<string> input_array;
string starting_position;
int input_number;
#endif
Input.cpp
#include <iostream>
#include <cmath>
#include <string>
#include <vector>
#include "Input.hpp"
using namespace std;
vector<string> Get_Input()
{
cin>>starting_position;
cin>>input_number;
for (int i = 0; i < input_number; i++)
{
cin>>input_array[i];
}
cout<<"Done";
return input_array;
}
的main.cpp
#include "Input.hpp"
#include <iostream>
using namespace std;
int main()
{
Get_Input();
return 0;
}
当我从头文件中删除变量声明并将它们放在cpp文件中但保留头文件中的函数声明时,程序构建没有错误。我的理解是变量和函数可以在头文件中声明。有人可以向我解释我错过了什么吗?
谢谢。
答案 0 :(得分:14)
头文件不是那么聪明,它只是告诉预处理器取整个头并把它放在包含线上。
如果这样做,你可以看到变量被声明两次。
要解决此问题,您应该在其中一个cpp文件中声明变量,并在标题中使用extern
。
就像在input.cpp中一样:
int input_number;
并在input.hpp中:
extern int input_number;
答案 1 :(得分:1)
include guard仅阻止复制已包含的文件(如果已复制),该文件在代码中正常工作且编译器可以成功编译代码。现在你得到的是一个链接器错误,在你的编译器生成了Input.cpp
和main.cpp
的目标文件后,它会找到两个符号 - 变量 - 具有相同的名称,并会开始抱怨哪一个我应该使用?
总而言之,当您在头文件中定义变量时,请添加extern
关键字以保持链接器满意。