私は、良いプログラミング手法を使用して、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ファイルに入れますが、関数宣言をヘッダーファイルに保持すると、プログラムはエラーなしでビルドされます。変数と関数はヘッダーファイルで宣言できることを理解しています。誰かが私に欠けていることを説明してもらえますか?
ありがとうございました。
ヘッダーファイルはそれほどスマートではなく、プリプロセッサにヘッダー全体を取得してインクルード行の代わりに配置するよう指示するだけです。
そうすると、変数が2回宣言されていることがわかります。
この問題を解決するには、cppファイルの1つで変数を宣言し、ヘッダーでextern
を使用する必要があります。
input.cppのように:
int input_number;
そしてinput.hppで:
extern int input_number;
インクルードガードは、コードで正常に機能し、コンパイラーがコードを正常にコンパイルできる、既にコピーされている場合にのみ、インクルードファイルのコピーを防ぎます。コンパイラがInput.cpp
およびmain.cpp
のオブジェクトファイルを生成すると、リンカーエラーが発生します。同じ名前の2つのシンボル(変数)が検出され、どちらが不満を訴え始めます。使用する?
したがって、ヘッダーファイルで変数を定義するときに要約するには、extern
キーワードを追加して、リンカーを満足させます。