2016-08-14 6 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に

私はヘッダファイルから変数の宣言を削除し、CPPに入れ
#include "Input.hpp" 
#include <iostream> 
using namespace std; 

int main() 
{ 

    Get_Input(); 
    return 0; 
} 

プログラムはエラーなしで構築されたヘッダーファイルに関数宣言を保持します。変数と関数をヘッダファイルで宣言できるのは私の理解です。誰かが私に行方不明を教えてもらえますか?

ありがとうございます。

答えて

3

ヘッダーファイルはそれほど賢明ではありません。単にヘッダー全体を取り込み、インクルード行の代わりに置くようにプリプロセッサーに指示します。

これを行うと、変数が2回宣言されていることがわかります。

この問題を解決するには、cppファイルの1つに変数を宣言し、ヘッダーにexternを使用する必要があります。

input.cppのように:

int input_number; 

とinput.hppで:

extern int input_number; 
+0

"extern"は私が探していたものです。簡単な例をありがとう! – ChrisCantrell

0

ザ・はそれはすでにあなたの中で正しく動作しているコピーされた場合、ガードにのみ含まれているファイルをコピー防ぐ含めますコンパイラはコードを正常にコンパイルできます。コンパイラがとmain.cppのオブジェクトファイルを生成した後で、同じ名前の2つのシンボル-variables-が見つかり、どちらを使用する必要があるのか​​不平を言うようになります。

したがって、ヘッダーファイルに変数を定義するときに要約すると、externキーワードを追加して、リンカーを幸せに保ちます。