IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Comment scinder son code source dans plusieurs fichiers?


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut Comment scinder son code source dans plusieurs fichiers?
    Bonjour,

    Je cherche partout un truc qui doit être facile à trouver mais je suis trop c...

    Je me suis mis récemment à faire des Windows Forms avec Visual C++ 2008.

    Mon code se perd de plus en plus au milieu du code généré automatiquement par Visual et je voudrais mettre mes fonctions dans des fichiers *.cpp séparés, mais à l'intérieur du projet.

    J'ai bien créé un nouvel élément dans le projet, mais le linker ne voit pas les fonctions qu'il contient
    Il doit bien falloir déclarer ces fonctions quelque part, mais où?

    Est ce que quelqu'un pourrait avoir la gentillesse de me dire comment on fait cela ou où je peux trouver le renseignement?

    J'ai bien cherché dans la FAQ et sur Google, mais je ne dois pas rentrer les bons mots clef.

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Il y a (principalement) deux types de fichiers à utiliser:

    Les fichiers d'en-tête qui contiennent les déclarations et qui ont une extension en .h, .hpp, (anciennement .hxx).

    Dans ce fichier, tu place:
    • les déclarations de fonctions libre
    • les déclarations de variables locales (même s'il vaut mieux les éviter)
    • les définitions d'énumérations
    • les définitions d'unions
    • les définitions de classes
    • les définitions de structures
    • les définitions d'alias de types (typedef)
    • L'implémentation de fonctions paramétrées (template)


    Et les fichiers d'implémentation, utilisant une extention parmi .cpp, .cxx dans lesquels tu place
    • l'instantiation des variables locales
    • l'implémentation des fonctions libres
    • l'implémentation des fonctions membres

    Une des habitudes souvent mise en avant est de créer un couple de fichier (en-tête + implémentation) par classe / objectif / responsabilité (lorsqu'il y a des fonctions libres).

    Pour permettre à un fichier de disposer de la déclaration d'une fonction ou de la définition d'une (classe, structure, union, énumération...), tu inclus le fichier d'en-tête dans laquelle se trouve la déclaration en question avec la directive préprocesseur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "nom_du_fichier"
    Evidemment, tous ces fichiers doivent être placé dans ton projet

    Ce n'est qu'un aperçu rapide et il y a évidemment quelques subtilités (entre autres au niveau de l'implémentation des fonctions paramétrées), mais qui te donne une idée générale de la manière de gérer un projet du point de vue des fichiers
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut
    Merci koala01 pour cette ultra rapide réponse.

    J'essaie cela après le repas et je t'informe

    Bonne journée et merci encore

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut
    Rebonjour koala01,

    Je ne dois pas tout comprendre, cela ne marche qu'en partie

    J'ai créé un nouveau projet Windows Forms que j'ai appelé Mon_Projet. Visual C++ 2008 a généré les *.h et *.cpp habituels ...

    J'ai cliqué sur "Projet", "Ajouter un élément" et j'ai ajouté un fichier *.h que j'ai appelé Mon_Include.h
    J'ai procédé de même et j'ai ajouté un fichier *.cpp que j'ai appelé Mes_Fonctions.cpp

    Visual C++ 2008 a bien dans le projet les 2 nouveaux fichiers crées, l'un dans les fichiers d'en-tête, l'autre dans les fichiers source

    Si je compile en laissant ces fichiers vides, j'ai une erreur C1010

    Si je rajoute dans Mes_Fonctions.cpp cela compile sans erreur, mais ai je fait la bonne manip ?

    Maintenant il faut que je me serve de ces fichiers, donc il faut que je rajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "Mon_Include.h"
    dans Mes_Fonctions.cpp, là c'est pas trop dur et dans le fichier Form1.h de Visual, Et là, je ne sais pas trop où le mettre ?

    Je l'ai mis à l'emplacement réservé aux déclarations du programmeur et cela compile sans erreur, est ce le bon endroit ?

    Maintenant dans Mon_Include.h je déclare une variable appelée ma_variable et je l'initialise là où on l'initialise d'habitude et cela compile ....

    Jusque là on peut dire que cela marche ....

    Passons à une fonction, c'est là que cela se corse.

    Je rajoute la fonction suivante dans Mes_Fonctions.cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Proj_Init ()
    {
           ma_variable = 1;
    }
    Là ça compile toujours

    Je rajoute dans mon Form1.h de Visual la ligne suivante Et là évidemment je me fais jeter avec une erreur C3861 "Identificateur introuvable"

    Normal ma fonction Proj_Init n'est pas déclarée dans Mon_Include.h

    Et là je ne sais pas comment faire, je récupère à tous les coups un message :

    error LNK2020: jeton non résolu (06000003)Mon_projet.Form1:: Proj_Init

    Comment déclarer la fonction ?

    Merci à ceux qui m'aideront

    Bonne journée

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Je vais essayer de répondre dans l'ordre, cependant, ne travaillant (pour l'instant) pas de manière habituelle avec Visual Studio, certains points me sont plus ou moins inconnu... tu m'en excusera
    Citation Envoyé par jlg_47 Voir le message
    J'ai créé un nouveau projet Windows Forms que j'ai appelé Mon_Projet. Visual C++ 2008 a généré les *.h et *.cpp habituels ...

    J'ai cliqué sur "Projet", "Ajouter un élément" et j'ai ajouté un fichier *.h que j'ai appelé Mon_Include.h
    J'ai procédé de même et j'ai ajouté un fichier *.cpp que j'ai appelé Mes_Fonctions.cpp
    Visual C++ 2008 a bien dans le projet les 2 nouveaux fichiers crées, l'un dans les fichiers d'en-tête, l'autre dans les fichiers source
    c'est déjà pas mal
    Citation Envoyé par jlg_47 Voir le message
    Si je compile en laissant ces fichiers vides, j'ai une erreur C1010

    Si je rajoute dans Mes_Fonctions.cpp cela compile sans erreur, mais ai je fait la bonne manip ?
    Je ne sais pas à quoi correspond cette erreur C1010, mais cela doit vouloir dire que le compilateur ne trouve pas comment compiler mes_fonction.cpp... ce qui est normal s'il ne trouve pas les différentes déclarations

    Pour autant que je le sache, stdafs.h reprend l'ensemble des fichiers d'en-tête existant et sert à permettre l'utilisation de ce que l'on appelle les "en-tête précompilés"...

    Il est donc "normal" que, lorsque tu inclus stdafx.h dans un fichier d'implémentation, que le compilateur retrouve les différentes déclarations reprises dans les différents fichiers d'en-tête
    Citation Envoyé par jlg_47 Voir le message
    Maintenant il faut que je me serve de ces fichiers, donc il faut que je rajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "Mon_Include.h"
    dans Mes_Fonctions.cpp, là c'est pas trop dur et dans le fichier Form1.h de Visual, Et là, je ne sais pas trop où le mettre ?
    Ben, comme pour n'importe quel autre fichier...

    Si tu as besoin, dans Form1.h, de quelque chose qui est déclaré dans Mon_include.h, rajoute "simplement" #include "Mon_include.h" en début de fichier
    Citation Envoyé par jlg_47 Voir le message
    Je l'ai mis à l'emplacement réservé aux déclarations du programmeur et cela compile sans erreur, est ce le bon endroit ?
    Apparemment, oui
    Citation Envoyé par jlg_47 Voir le message
    Maintenant dans Mon_Include.h je déclare une variable appelée ma_variable et je l'initialise là où on l'initialise d'habitude et cela compile ....

    Jusque là on peut dire que cela marche ....
    c'est une bonne chose
    Citation Envoyé par jlg_47 Voir le message
    Passons à une fonction, c'est là que cela se corse.

    Je rajoute la fonction suivante dans Mes_Fonctions.cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Proj_Init ()
    {
           ma_variable = 1;
    }
    Là ça compile toujours

    Je rajoute dans mon Form1.h de Visual la ligne suivante
    Lorsque tu déclare une fonction, tu dois donner le prototype complet...

    Tu dois donc déclarer ta fonction sous la forme de

    Citation Envoyé par jlg_47 Voir le message
    Et là évidemment je me fais jeter avec une erreur C3861 "Identificateur introuvable"

    Normal ma fonction Proj_Init n'est pas déclarée dans Mon_Include.h
    c'est donc qu'il faut la déclarer (comme indiqué plus haut) dans... Mon_Include.h
    Citation Envoyé par jlg_47 Voir le message
    Et là je ne sais pas comment faire, je récupère à tous les coups un message :

    error LNK2020: jeton non résolu (06000003)Mon_projet.Form1:: Proj_Init
    cela indique que l'éditeur de lien ne trouve pas l'implémentation de la fonction membre Proj_Init...

    Et c'est quelque part normal:

    Si tu déclare la fonction dans la classe Form1, tu dois l'implémenter sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Form1::Proj_Init()
    {
        /* ce qui doit être fait */
    }
    Si tu veux utiliser Proj_Init() comme fonction libre, tu dois la déclarer en dehors de la classe Form1 et l'implémenter de manière "classique" (sous la forme de void Proj_Init(){ce qui doit etre fait})
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Quelques petites remarques
    Citation Envoyé par koala01 Voir le message
    Je ne sais pas à quoi correspond cette erreur C1010, mais cela doit vouloir dire que le compilateur ne trouve pas comment compiler mes_fonction.cpp... ce qui est normal s'il ne trouve pas les différentes déclarations
    De mémoire, cela veut plutôt dire que tu souhaite utiliser un en-tête précompilé mais que tu n'inclus pas cet en-tête dans ton fichier.
    Citation Envoyé par koala01 Voir le message
    Pour autant que je le sache, stdafs.h reprend l'ensemble des fichiers d'en-tête existant et sert à permettre l'utilisation de ce que l'on appelle les "en-tête précompilés"...
    Les en-têtes pré-compilés ne sont pas seulement ceux existant, mais à priori ceux dont tu auras besoin partout ou presque. Ca permet d'optimiser la compilation de ces en-têtes pour ne pas avoir à les compiler dans chaque source, mais de les compiler une fois pour toute.

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par koala01 Voir le message
    ...Dans ce fichier (d'en-tête), tu places:
    • les déclarations de fonctions libre
    • les déclarations de variables locales (même s'il vaut mieux les éviter)
    • les définitions d'énumérations
    • les définitions d'unions
    • les définitions de classes
    • les définitions de structures
    • les définitions d'alias de types (typedef)

    ...
    C'est du chipotage mais on parle de définitions d'unions, classes, structures, typedef ou bien de déclarations.

    Pour moi dans ma tête, une définition :
    • génère du code objet
    • n'a sa place que dans un .cpp (ou .c ou autre)
    alors qu'une déclaration :
    • c'est de l'information pour le compilateur
    • cela ne génère pas de code
    • les déclarations publiques/exportées se trouvent dans un .h
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut
    Merci beaucoup koala01 et excuse moi pour le dérangement,

    Citation Envoyé par koala01 Voir le message
    Lorsque tu déclare une fonction, tu dois donner le prototype complet...

    Tu dois donc déclarer ta fonction sous la forme de


    c'est donc qu'il faut la déclarer (comme indiqué plus haut) dans... Mon_Include.h

    cela indique que l'éditeur de lien ne trouve pas l'implémentation de la fonction membre Proj_Init...
    ça j'avais déjà fait parce que c'était la seule chose qui pouvait me venir à l'esprit mais cela ne marche pas, je reçois le message suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    d:\....\Form1.h(76) : error C3861: 'Proj_Init'*: identificateur introuvable
    Citation Envoyé par koala01 Voir le message

    Si tu déclare la fonction dans la classe Form1, tu dois l'implémenter sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Form1::Proj_Init()
    {
        /* ce qui doit être fait */
    }
    Si tu veux utiliser Proj_Init() comme fonction libre, tu dois la déclarer en dehors de la classe Form1 et l'implémenter de manière "classique" (sous la forme de void Proj_Init(){ce qui doit etre fait})
    ça ne marche pas non plus

    Ce qui m'intéresse, c'est de l'implémenter sous la forme classique.

    Le problème est que je ne comprends rien (ou presque) au code généré par Visual.

    Visual génère un fichier d'en-tête nommé stdafx.h (bizarre !!!) qui contient cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // stdafx.h*: fichier Include pour les fichiers Include système standard,
    // ou les fichiers Include spécifiques aux projets qui sont utilisés fréquemment,
    // et sont rarement modifiés
    #pragma once
     
    // TODO*: faites référence ici aux en-têtes supplémentaires nécessaires au programme
    Qu'est que fait l'instruction #pragma once?

    Vu le commentaire, j'ai essayé d'y mettre #include "Mon_Include.h" et je me fais jeter

    Ensuite il génère un fichier Mon_Projet.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    // Mon_Projet.cpp*: fichier projet principal.
     
    #include "stdafx.h"
    #include "Form1.h"
     
    using namespace Mon_Projet;
     
    [STAThreadAttribute]
    int main(array<System::String ^> ^args)
    {
    	// Activation des effets visuels de Windows*XP avant la création de tout contrôle
    	Application::EnableVisualStyles();
    	Application::SetCompatibleTextRenderingDefault(false); 
     
    	// Créer la fenêtre principale et l'exécuter
    	Application::Run(gcnew Form1());
    	return 0;
    }
    Apparemment il n'y a pas à y toucher

    Puis il génère un fichier d'en-tête Form1.h dans lequel on y met tout ce qu'on doit mettre, mais c'est justement là que je veux sortir mon code parce que ce fichier grossit très vite et tout se mélange

    Pourquoi met on tout dans un fichier *.h? je m'attendrais à mettre des choses dans un fichier *.cpp

    Voilà le fichier Form1.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    #pragma once
     
     
    namespace Mon_Projet {
     
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
     
    	/// <summary>
    	/// Description résumée de Form1
    	///
    	/// AVERTISSEMENT*: si vous modifiez le nom de cette classe, vous devrez modifier la
    	///          propriété 'Nom du fichier de ressources' de l'outil de compilation de ressource managée
    	///          pour tous les fichiers .resx dont dépend cette classe. Dans le cas contraire,
    	///          les concepteurs ne pourront pas interagir correctement avec les ressources
    	///          localisées associées à ce formulaire.
    	/// </summary>
    	public ref class Form1 : public System::Windows::Forms::Form
    	{
    	public:
    		Form1(void)
    		{
    			InitializeComponent();
    			//
    			//TODO*: ajoutez ici le code du constructeur
    			//
    		}
     
    	protected:
    		/// <summary>
    		/// Nettoyage des ressources utilisées.
    		/// </summary>
    		~Form1()
    		{
    			if (components)
    			{
    				delete components;
    			}
    		}
     
    	private:
    		/// <summary>
    		/// Variable nécessaire au concepteur.
    		/// </summary>
    		#include "Mon_Include.h"  // rajouté par mes soins !!
    		System::ComponentModel::Container ^components;
     
    #pragma region Windows Form Designer generated code
    		/// <summary>
    		/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
    		/// le contenu de cette méthode avec l'éditeur de code.
    		/// </summary>
    		void InitializeComponent(void)
    		{
    			this->SuspendLayout();
    			// 
    			// Form1
    			// 
    			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
    			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
    			this->ClientSize = System::Drawing::Size(292, 266);
    			this->Name = L"Form1";
    			this->Text = L"Form1";
    			this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
    			this->ResumeLayout(false);
     
    		}
    #pragma endregion
    	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
    			 }
    	};
    }
    Je ne comprends pas les instructions #pragma once, #pragma region et #pragma endregion
    Est ce important?

    Excuse moi pour le dérangement et merci encore pour ton aide.

    Bonne soirée
    Jean-Louis

  9. #9
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par jlg_47 Voir le message
    Qu'est que fait l'instruction #pragma once?
    #pragma once est une extension non portable de Visual Studio. Elle permet de ne pas inclure un fichier déjà inclus pour éviter les redéfinitions multiples

    A mon avis, si tu veux du code portable, il faudrait remplacer toutes ces occurences par quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #ifdef INCLUDE_<mon_ficher_h>
    #define INCLUDE_<mon_ficher_h>
     
    // ici le contenu du fichier 
    // ...
     
    #endif //#ifdef INCLUDE_<mon_ficher_h>
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    C'est du chipotage mais on parle de définitions d'unions, classes, structures, typedef ou bien de déclarations.

    Pour moi dans ma tête, une définition :
    • génère du code objet
    • n'a sa place que dans un .cpp (ou .c ou autre)
    alors qu'une déclaration :
    • c'est de l'information pour le compilateur
    • cela ne génère pas de code
    • les déclarations publiques/exportées se trouvent dans un .h
    Bonjour RAM-0000

    D'abord merci de t'intéresser à mon cas.

    C'est pour cela que je ne comprends pas ce que fait Visual C++ avec les Windows Forms.

    Tout le code va dans le fichier Form1.h qui est pour moi est un fichier d'en-tête.

    L'IDE te génère une fenêtre vide et quand tu rajoutes un bouton par exemple, tu cliques sur le bouton et l'IDE t'ouvre automatiquement ce fichier Form1.h à l'endroit où tu dois écrire la partie de code qui s'exécutera quand l'utilisateur cliquera sur le bouton.

    Pourquoi ces lignes de code exécutable vont dans un fichier *.h ?

    Je vois que cela fonctionne, mais si je veux mettre mes lignes de codes dans un autre fichier ça merde.

    Bonne soirée et merci encore

    Jean-Louis

  11. #11
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Je ne connais pas du tout les Windows Forms, tu peux mettre un bout (ou tout) de ton fichier .h pour voir ?
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    C'est du chipotage mais on parle de définitions d'unions, classes, structures, typedef ou bien de déclarations.

    Pour moi dans ma tête, une définition :
    • génère du code objet
    • n'a sa place que dans un .cpp (ou .c ou autre)
    alors qu'une déclaration :
    • c'est de l'information pour le compilateur
    • cela ne génère pas de code
    • les déclarations publiques/exportées se trouvent dans un .h
    en fait, une déclaration permet juste au compilateur de savoir que quelque chose existe...

    Ainsi, la déclaration d'une classe n'est-elle que l'unique ligne
    (utilisée dans une optique de déclaration anticipée)

    La définition de quelque chose consiste à lui "donner un corps".

    Pour une fonction, cela revient l'implémenter (et n'a donc normalement pas grand chose à faire dans un fichier d'en-tête), mais pour une structure de données personnalisée (ce qui regroupe les structures, les classes, les unions et les typedef) cela revient à ... déclarer les fonctions et les variables membres...

    Dans un fichier d'en-tête, on ne trouve (normalement) que des déclarations de variables et de fonctions.

    Mais, ces déclarations de variables et de fonctions pouvant se trouver dans une structure de données personnalisée, il faut accepter l'idée d'une définition de la structure de données dans le fichier d'en-tête

    Maintenant, il n'est pas exclu que mon interprétation des termes soit tout aussi mauvaise que la tienne, et que la vérité se trouve "quelque part" entre les deux
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Je ne connais pas du tout les Windows Forms, tu peux mettre un bout (ou tout) de ton fichier .h pour voir ?
    Tu le trouves dans mon post daté de 18h43

    Bonne soirée

  14. #14
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Maintenant, il n'est pas exclu que mon interprétation des termes soit tout aussi mauvaise que la tienne, et que la vérité se trouve "quelque part" entre les deux
    Oui, la vérité est ailleurs agent Koala01

    Citation Envoyé par jlg_47 Voir le message
    Tu le trouves dans mon post daté de 18h43
    Tu as raison, j'avais pas vu

    Le code généré dans Form1.h est spécial.

    Normalement, tu déclares des fonctions dans un .h et tu définis les fonctions dans le .cpp (c'est ce qu'a dit Koala01 et ce que je pense aussi).

    En C++, il est possible de faire les 2 en même temps et de tout mettre dans un .h. C'est un raccourci pour des petites fonctions de quelques lignes/quelques instructions. En général, c'est préfixé par le mot clé "inline" qui n'est pas mit dans ton cas (peut être est ce que c'est facultatif car le compilateur voie bien que c'est du code "inline".

    C'est une pratique que je limite à une seule instruction (mais c'est personnel comme règle) genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class MaClasse
    {
    public:
    ...
       inline int GetValue(void) const { return m_value; }
    private:
       int m_value;
    };
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut
    Bonsoir et merci à tous,

    Bon quoique je fasse dès que je mets ma fonction dans un autre fichier que Form1.h, je récupère le message suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    d:\mon_projet\mon_projet\Form1.h(75) : error C3861: 'Proj_Init'*: identificateur introuvable
    Bonne soirée

    Jean-Louis

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    243
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2008
    Messages : 243
    Points : 103
    Points
    103
    Par défaut
    Re bonsoir,

    Je viens d'essayer un truc qui marche mais qui ne me plaît pas

    Au lieu de mettre mes fonctions dans un fichier Mes_Fonctions.cpp, je les mets dans un fichier Mes_Fonctions.h

    Et je rajoute dans Form1.h la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "Mes_Fonctions.h"
    juste après l'instruction En fait cela revient à sortir les fonctions de là où elles se trouvent dans Form1.h, de les mettre dans un *.h que j'inclus à l'endroit où je les ai sorties

    Bon ça marche, en réfléchissant cela me paraît normal, mais je ne trouve pas cela très beau.

    Si vous avez une meilleure idée, je suis preneur évidemment

    Bonne nuit
    Jean-Louis

Discussions similaires

  1. Réponses: 36
    Dernier message: 25/08/2014, 12h17
  2. [HTML 5] Code source en plusieurs fichiers
    Par gregory2526 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 26/11/2012, 17h15
  3. Comment répartir son script dans plusieurs fichiers
    Par volkukan dans le forum Général Python
    Réponses: 2
    Dernier message: 25/11/2009, 12h40
  4. répartir son code dans plusieurs fichiers
    Par peuf23 dans le forum Débuter
    Réponses: 5
    Dernier message: 10/09/2008, 12h00
  5. Réponses: 10
    Dernier message: 08/02/2007, 13h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo