2016-08-14 131 views
2

我想创建一个简单的程序,它使用良好的编程习惯在C++中从用户处获取输入。它由Input.hpp,Input.cpp和main.cpp组成。即使我正在使用ifndef来防止发生多重定义错误,我仍然收到多重定义错误。在头文件中声明变量C++

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文件,但保留函数声明在程序生成的头文件中,没有错误。我的理解是变量和函数可以在头文件中声明。有人可以向我解释我缺少的东西吗?

谢谢。

回答

3

头文件不是很聪明,它只是告诉预处理器采取整个头,而不是包含行。

如果你这样做,你可以看到变量被声明两次。

要解决此问题,您应该在您的cpp文件之一中声明变量,并在标头中使用extern

像input.cpp:

int input_number; 

和input.hpp:

extern int input_number; 
+0

“extern”是我寻找的东西。感谢一个简单的例子! – ChrisCantrell

0

的包括防护装置只能防止复制包含的文件,如果它已经被复制它在工作正常的代码和编译器可以成功编译代码。现在你得到的是一个链接器错误,在你的编译器生成了和main.cpp的目标文件后,它会找到两个具有相同名称的符号 - 变量 - 并开始抱怨我应该使用哪一个?

所以总结一下,当你在一个头文件中定义一个变量时,加上extern关键字来保持链接器的快乐。