在头文件中声明变量
Declaring variables in header files C++
我正在尝试创建一个简单的程序,使用良好的编程实践从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文件中,但在头文件中保留函数声明时,程序构建没有错误。这是我的理解,变量和函数可以在头文件中声明。有人能解释一下我错过了什么吗?
谢谢。
头文件不是很聪明,它只是告诉预处理器取整个头文件,并把它代替包含行。
如果你这样做,你可以看到变量被声明了两次。
要解决这个问题,你应该在一个cpp文件中声明变量,并在头文件中使用extern
。
like in input.cpp:
int input_number;
和input.hpp:
extern int input_number;
include保护只防止复制包含的文件,如果它已经被复制,在你的代码中正常工作,编译器可以成功编译代码。现在你得到的是一个链接器错误,在你的编译器为Input.cpp
和main.cpp
生成目标文件后,它会发现两个符号-变量-具有相同的名称,并开始抱怨我应该使用哪一个?
所以总的来说,当您在头文件中定义变量时,添加extern
关键字以保持链接器的快乐。
相关文章:
- 在疯狂的部分中声明变量
- 如何在C++中为高分辨率时钟声明变量?
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- CUDA 的性能取决于声明变量
- 如何在不为其声明变量的情况下获取和使用常量值的地址?
- C++声明变量时自动类型推断而不初始化
- 在不同循环中多次声明变量的优点
- 奇怪的错误 C2131 与 constexpr 声明变量
- 是否可以在 "if" 语句中声明变量?
- 在python-ctypes中声明变量并传递给dll函数
- 在递归函数C++中声明变量
- 只有一个定义/声明时标头声明变量的多堆定义错误
- 奇怪的未声明变量编译器错误
- 我在C++程序中声明变量时遇到问题
- 在命名空间中声明变量
- C++ lambda 按值捕获,而无需更早声明变量
- 声明变量以保存字符串列表时的内存分配
- 如何声明C 变量应突变
- 为什么允许在开关语句中声明变量?但不是声明 初始化
- 在同一命名空间中声明变量和函数是否出错?[C++]