web-dev-qa-db-fra.com

Déclaration de variables dans les fichiers d'en-tête C ++

J'essaie de créer un programme simple qui accepte les entrées de l'utilisateur en C++ en utilisant de bonnes pratiques de programmation. Il se compose de Input.hpp, Input.cpp et main.cpp. Je reçois toujours une erreur de définition multiple même si j'utilise ifndef pour éviter cela.

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;
}

Lorsque je supprime les déclarations de variables du fichier d'en-tête et les mets dans le fichier cpp, mais que je conserve la déclaration de fonction dans le fichier d'en-tête, le programme crée sans erreur. Je crois comprendre que les variables et les fonctions peuvent être déclarées dans des fichiers d'en-tête. Quelqu'un peut-il m'expliquer ce qui me manque?

Je vous remercie.

14
Kareem Aboughazala

Le fichier d'en-tête n'est pas si intelligent, il dit simplement au pré-processeur de prendre tout l'en-tête et de le mettre à la place de la ligne d'inclusion.

si vous le faites, vous pouvez voir que la variable est déclarée deux fois.

Pour résoudre le problème, vous devez déclarer les variables dans l'un de vos fichiers cpp et utiliser extern dans les en-têtes.

comme dans input.cpp:

int input_number;

et dans input.hpp:

extern int input_number;
17
SHR

La garde d'inclusion empêche uniquement la copie du fichier inclus s'il a déjà été copié et qu'il fonctionne correctement dans votre code et que le compilateur peut compiler le code avec succès. Maintenant, ce que vous obtenez est une erreur de l'éditeur de liens, une fois que votre compilateur a généré les fichiers objets pour Input.cpp et main.cpp il trouvera deux symboles - variables - du même nom et commencera à se plaindre lequel devrais-je utiliser?

Donc, pour résumer lorsque vous définissez une variable dans un fichier d'en-tête, ajoutez le mot clé extern pour garder l'éditeur de liens heureux.

2
Mohamed Moanis