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 :

Inclure plusieurs fichiers : double inclusion ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 34
    Par défaut Inclure plusieurs fichiers : double inclusion ?
    Bonjour,

    J'ai un fichier main.cpp (je suis sous code::blocks, et il met l'extension .cpp lors de la création d'un projet SDL, mais c'est quand même du C), un fichier personnages.c, et un fichier personnages.h

    J'ai besoin d'une fonction (qui est dans personnages.c) dans main(), j'include donc mon fichier personnages.h (qui contient des external int)

    MAIS cette fonction a besoin de variables qui se trouvent dans main(), il faudrait donc que j'include le main.cpp dans personnages.c.

    Je vois pas trop comment faire, dois-je créer un main.h qui contient le prototype de main() et include ce main.h dans personnages.c ?
    Mais dans ce cas la, j'aurais une double inclusion --> donc erreur
    SAUF si je fais un #ifndef, mais vers ce moment là, je suis un peu perdu : ou dois-je faire mes #ifndef ???

    Pouvez vous m'aider SVP ?
    Merci beaucoup !

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Bonjour,

    Tu sembles utiliser des variables globales, essaye déjà de les éviter au maximum.

    Sinon, en cas de problème, on utilise souvent des déclarations anticipées, exemple : struct MaStruct;
    cf code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #ifndef TOTO
     
    struct X; //pour les structures contenu dans foo
    extern int i; //pour les variables globales contenu dans foo (c'est le maaal :aie:)
     
    //mes prototypes
     
    struct Z{... };
     
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //TOTO.c
    #include "toto.h"
    #include "foo.h"
     
    //code des fonctions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifndef FOO
     
    struct Z;
    struct X{... };
    int i;
     
    //mes prototypes
     
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //foo.c
    #include "foo.h"
    #include "toto.h"
     
    //code des fonctions

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    J'ai un fichier main.cpp (je suis sous code::blocks, et il met l'extension .cpp lors de la création d'un projet SDL, mais c'est quand même du C), un fichier personnages.c, et un fichier personnages.h
    Soit on fait du C, soit on fait du C++. Si on fait du langage X, on les mets dans des fichiers de type X. C'est le genre de trucs à perdre les lecteurs, risquer que d'autres personnes y mettent du code C++ non compatible avec du C, induire en erreur ton compilateur qui voyant *.cpp pourrait appeler g++ et non gcc....

  4. #4
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juillet 2012
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2012
    Messages : 34
    Par défaut Reformulation
    Je n'utilise pas de variables globales, mes "external int" sont des fonctions
    de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    external int fonction(int a, int b)
    Donc, finalement, la question est plus une question du type :

    "Comment puis-je inclure deux fichiers si chacun à besoin de l'autre ?"

    Il me semble avoir lu qu'on ne doit jamais inclure des .c, mais si j'inclus personnages.h dans mon .cpp, il me met une erreur du type :
    "Erreur : [variable] is not declared on the scope"

    @Bktero : code::blocks attribue automatiquement un main.cpp au projet lors de la création d'un projet SDL. Comment changer les options de code::blocks pour qui'l crée un main.c à la place alors ??

    Merci !

  5. #5
    Membre éclairé Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Par défaut
    Citation Envoyé par totocaracana Voir le message
    Donc, finalement, la question est plus une question du type :
    "Comment puis-je inclure deux fichiers si chacun à besoin de l'autre ?"
    Tu ne peux pas !
    Par contre, ainsi que tu le proposais, tu peux créer un fichier main.h (c'est un peu vilain quand même mais bon, pourquoi pas ?) et un personnages.h qui seront tous deux inclus dans main.c et dans personnages.c.
    Puis, pour éviter les ennuis, tu tapes en en-tête de ton fichier main.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef MAIN_H
    #define MAIN_H
     
    /// ici tes déclarations pour main
     
    #endif
    Et tu fais pareil pour personnages.h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef PERSO_H
    #define PERSO_H
     
    /// ici tes déclarations pour personnages
     
    #endif
    C'est tout !

  6. #6
    Membre éclairé Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Par défaut (bis)
    code::blocks attribue automatiquement un main.cpp au projet lors de la création d'un projet SDL. Comment changer les options de code::blocks pour qui'l crée un main.c à la place alors ??
    Tu ne peux pas, sauf à réécrire un wizard !

    MAIS ... tu peux soit créer un projet vide (c'est ce que je fais) et le configurer à la main, soit tu peux renommer ton main.cpp en main.c ... ET faire un clic droit sur ton fichier main.c dans Code::Blocks, afficher les propriétés (Properties) puis choisir l'onglet Avancé (Advanced) et remplacer CPP par CC pour que ce soit bien compilé par gcc et non par g++.

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par totocaracana Voir le message
    Je n'utilise pas de variables globales, mes "external int" sont des fonctions
    de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    external int fonction(int a, int b)
    Pour moi un int est une variable et non une fonction
    Si tu veux être compris, soit plus précis, c'est une fonction retournant un int.
    D'ailleurs le bon mot clé n'est-il pas extern ?

    De plus cela fait quelques temps que je programme et je n'ai encore jamais eu à utiliser extern pour déclarer des fonctions, généralement on se contente de mettre le prototype dans un .h, le code dans un .c puis d'inclure le .h partout où on a besoin de la fonction.

    Citation Envoyé par totocaracana Voir le message
    Il me semble avoir lu qu'on ne doit jamais inclure des .c, mais si j'inclus personnages.h dans mon .cpp, il me met une erreur du type :
    "Erreur : [variable] is not declared on the scope"
    On ne peut pas vraiment voir ce que tu fais, pourrais-tu nous montrer ces fichiers?

    Citation Envoyé par totocaracana Voir le message
    @Bktero : code::blocks attribue automatiquement un main.cpp au projet lors de la création d'un projet SDL. Comment changer les options de code::blocks pour qui'l crée un main.c à la place alors ??
    Au pire rien ne t'empêche de créer un projet vide.

  8. #8
    Membre Expert
    Profil pro
    Développeur en systèmes embarqués retraité
    Inscrit en
    Mars 2006
    Messages
    952
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2006
    Messages : 952
    Par défaut
    Salut,

    Citation Envoyé par totocaracana Voir le message
    Comment changer les options de code::blocks pour qui'l crée un main.c à la place alors ??
    Euh... Peut-être en ne cliquant pas trop vite dans le wizard? La deuxième page propose le choix entre C et C++, avec C++ par défaut. Du coup si on choisit C, on a bien un main.c créé dans le projet.

    A+

    Pfeuh
    Images attachées Images attachées  

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    D'ailleurs le bon mot clé n'est-il pas extern ?

    De plus cela fait quelques temps que je programme et je n'ai encore jamais eu à utiliser extern pour déclarer des fonctions
    Le mot-clé en effet extern. J'ai souvenir que les fonctions étaient externes par défaut et qu'il était donc inutile de le préciser. C-Faq dit simplement que ce mot-clé ne s'applique pas aux fonctions : http://c-faq.com/decl/extern.html

  10. #10
    Membre éclairé Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Euh... Peut-être en ne cliquant pas trop vite dans le wizard? La deuxième page propose le choix entre C et C++, avec C++ par défaut. Du coup si on choisit C, on a bien un main.c créé dans le projet.
    Pour un nouveau projet de type console par exemple, tu as raison, mais j'insiste sur le fait que ce choix n'est pas proposé dans le wizard d'un nouveau projet SDL qui ne montre pas cette page de choix et va directement à la détermination de l'emplacement et du nom du projet puis impose un fichier main.cpp ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/07/2013, 11h50
  2. Inclure plusieurs fichiers js dans une page html
    Par verocv dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/12/2008, 11h02
  3. inclusion en tete dans plusieurs fichiers
    Par john123 dans le forum ASP
    Réponses: 1
    Dernier message: 15/06/2007, 13h01
  4. [struts] utiliser plusieurs fichiers properties
    Par jaimepasteevy dans le forum Struts 1
    Réponses: 7
    Dernier message: 03/10/2003, 17h02
  5. Génerer automatiquement plusieurs fichier .doc
    Par brunovitch dans le forum QuickReport
    Réponses: 3
    Dernier message: 09/07/2002, 08h19

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