在头文件中声明变量C ++ [重复]

问题描述 投票:16回答:2

我正在尝试创建一个简单的程序,并使用良好的编程习惯从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文件中,但将函数声明保留在头文件中时,程序将构建而没有错误。据我了解,可以在头文件中声明变量和函数。有人可以向我解释我所缺少的吗?

谢谢。

c++ header-files
2个回答
18
投票

Header文件不是很聪明,它只是告诉预处理器将整个标头放入而不是包含行。

如果执行此操作,则可以看到变量被声明两次。

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

就像在input.cpp中一样:

int input_number;

和在input.hpp中:

extern int input_number;

3
投票

include防护仅在包含的文件已经被复制(如果在您的代码中正常工作,并且编译器可以成功编译代码)时,才阻止复制该文件。现在,您得到的是一个链接器错误,编译器为Input.cppmain.cpp生成目标文件后,它将找到两个具有相同名称的符号-variables-,并开始抱怨我应该使用哪个符号?

总而言之,当您在头文件中定义变量时,请添加extern关键字以使链接程序保持满意状态。

© www.soinside.com 2019 - 2024. All rights reserved.