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 :

Inclusion .h par deux .c


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Points : 41
    Points
    41
    Par défaut Inclusion .h par deux .c
    Bonjour,

    J'ai une petite question...
    J'ai deux fichiers .c, l'un contenant une API, et l'autre contenant les fonctions internes du projets.

    je souhaite inclure un fichier .h dans les deux fichiers .c. Le but étant entre autre, d'avoir des variables partagées entre les deux fichiers (entre autre un buffer utilisé en débug pour les traces)

    Mais dès que j'inclue le .h dans les deux fichiers, j'ai une erreurs:
    Symbol blabla multiply defined (...)

    J'ai tenté un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef fichier_h
        #define fichier_h
        #define EXTERN
    #else
        #define EXTERN  extern
    #endif
    En plaçant un EXTERN devant les définitions de mes différentes variables, mais cela ne marche pas. Quelqu'un aurait il une idée?

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2010
    Messages : 33
    Points : 39
    Points
    39
    Par défaut
    Respectes-tu bien la structure d'un fichier H?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifndef FICHIER_H
    #define FICHIER_H
     
    //Declaration des variables
     
    //Declaration des fonctions
     
    #endif /*FICHIER_H*/
    #ifndef et #endif "encadent" l'ensemble des déclarations

    Et alors, dans les différents fichier C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include "fichier.h"

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Oui, la structure est respectée.

    Le problème ne vient pas du fait que les définitions ne sont pas trouvées, mais qu'elles sont en doubles.

    Visiblement, la compilation de fichier_api.c inclue les variables (ca, c'est normal). Mais lors de la compilation de fichier_interne.c, l'inclusion du même .h, provoque la RE-déclaration des même variables.

    Plutôt que de "comprendre" que c'est la même variable, le compilateur tente de faire une nouvelle référence. Le nom étant déjà utilisé, il y a une erreur.

  4. #4
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Bonjour,

    GNÉ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef fichier_h
        #define fichier_h
        #define EXTERN
    #else
        #define EXTERN  extern
    #endif
    Si ça c'est respecter la structure d'un fichier .h, alors je suis Linus Torvalds

    Ce serait pas plûtot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #ifndef fichier_h
        #define fichier_h
        #define EXTERN extern
    #endif
    ?

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Quel est l'intérêt de cette ligne
    d'ailleurs ?

    Je l'ai déjà vu une fois dans un code source, mais je n'ai pas vu l'intérêt

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par cauriera Voir le message
    Le problème ne vient pas du fait que les définitions ne sont pas trouvées, mais qu'elles sont en doubles.

    Visiblement, la compilation de fichier_api.c inclue les variables (ca, c'est normal). Mais lors de la compilation de fichier_interne.c, l'inclusion du même .h, provoque la RE-déclaration des même variables.

    Plutôt que de "comprendre" que c'est la même variable, le compilateur tente de faire une nouvelle référence. Le nom étant déjà utilisé, il y a une erreur.
    Le comportement observé est tout à fait normal. Les gardes anti-réinclusion dans les .h empêche l'inclusion multiple d'un header dans un même .c mais non pas d'influence entre deux .c.
    La définition de deux variables avec le même nom crée deux variables.

    La meilleure solution serait de supprimer les variables globales et en particulier les variables globales partagées entre deux fichiers.

    Si tu n'as vraiment pas le choix, il faut définir la variable une seule fois et la déclarer partout où il y en a besoin.
    La solution généralement utilisée consiste à déclarer la variable dans le .h avec extern. Et de la définir dans un seul des .c (voire dans un .c dédié). Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //global.h
    #ifndef GLOBAL_H
    #define GLOBAL_H
     
    extern int myGlobal;
     
    ...
     
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //global.c
    #include "global.h"
     
    int myGlobal;
     
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //main.c
    #include "global.h"
     
    ...

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Très bien, merci je vais faire comme ca.
    Je sais qu'il faut éviter les variables globales, mais pour certaines je n'ai pas le choix.

  8. #8
    Membre expérimenté
    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
    Points : 1 351
    Points
    1 351
    Par défaut
    Salut,

    Citation Envoyé par Bktero Voir le message
    Quel est l'intérêt de cette ligne
    d'ailleurs ?

    Je l'ai déjà vu une fois dans un code source, mais je n'ai pas vu l'intérêt
    Cette ligne seule ne suffit pas. Soit un source "sharable.c" avec son header "sharable.h". Au début de "sharable.c", on met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define SHARABLE_PRIVATE
    #include "sharable.h"
    au lieu de simplement:
    Dans "sharable.h", on a un squelette du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef SHARABLE_HEADER
    #define SHARABLE_HEADER
     
    #ifdef SHARABLE_PRIVATE
    #define EXTERN
    #else
    #define EXTERN extern
    #endif
     
    EXTERN int toto;
    EXTERN int tata;
     
    #undef EXTERN
    #endif
    Ça permet au source propriétaire du header de déclarer ses globales sans le extern, et tous les autres sources qui incluront ce header préfixeront avec extern. Cette façon de faire n'a plus lieu d'être en C99, on peut préfixer sans problème n'importe quelle déclaration de variable globale avec extern. Mais en C90, c'était obligatoire me semble t-il.

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Ah oui le code ressemblait à ton sharable.h!

    Je crois que j'ai compris le principe. Du coup, tu peux toujours inclure ta liste de variables globales. Dans le code que j'avais vu, il me semble qu'il y avait un fichier avec une fonction pour initialiser ces variables globales. Dans ton exemple, ça doit correspondre à sharable.c.

    Si c'est bien ça, je vais m'empresser de retenir cette méthode. Je la trouve propre et élégante

    Merci bien !

  10. #10
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    ha voila, cette solution ressemble effectivement à ce que je voulais faire. J'aime bien cette solution ou les variables ne sont définies qu'une et une seule fois dans un seul fichier.

    Pour le problème de l'initialisation des variables, tu peux utiliser cette solution la, toujours dans le meme exemple:

    Dans "sharable.h", on aurait:

    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
     
     
    #ifndef SHARABLE_HEADER
    #define SHARABLE_HEADER
     
    #ifdef SHARABLE_PRIVATE
    #define EXTERN
    #else
    #define EXTERN extern
    #endif
     
    #ifdef SHARABLE_PRIVATE
      EXTERN int toto = 0;
      EXTERN int tata = 0;
    #else
      EXTERN int toto;
      EXTERN int tata;
    #endif
     
    #undef EXTERN
    #endif

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Du coup, ca suffirait juste ça non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef SHARABLE_HEADER
    #define SHARABLE_HEADER
     
    #ifdef SHARABLE_PRIVATE
      int toto = 0;
      int tata = 0;
    #else
      extern int toto;
      extern int tata;
    #endif
     
    #endif

  12. #12
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Oui en effet, sur cet exemple, cela revient exactement au même.

  13. #13
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Mouais mouais mouais.... J'ai appliqué cette technique et j'ai passé une heure à comprendre pourquoi mon projet ne voulait plus linker. J'ai réussi à le faire linker, mais c'est un peu du bricolage. Et surtout, ça pose un problème de "conception" de mes inclusions de fichiers.

    Voici les différents fichiers que j'ai créé sous Codeblock (Windows XP).

    1) Le fichier avec les déclarations des variables globales:
    Code Fichier globales.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef GLOBALES_H
    #define GLOBALES_H
     
        #ifdef INIT_GLOBALES
        char g_strFoo[100] = "Bonjour !\nJe suis une chaine globale :)\n\n";
     
        #else
        extern char g_strFoo[100];
     
        #endif
     
    #endif

    2) Un fichier source faisant un appel à cette variable globale :
    Code Fichier appel.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include "appel.h"
     
    void modifierGlobales(void)
    {
        strcpy(g_strFoo,"Et du coup tout le monde peut me modifier :/");
    }

    3) Le header l'accompagnant :
    Code Fichier appel.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifndef APPEL_H
    #define APPEL_H
     
    #include "globales.h"
    #include <string.h>
     
    void modifierGlobales(void);
     
    #endif

    4) Un fichier source main pour faire travailler tout ça :
    Code Fichier main.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "main.h"
     
    int main(void)
    {
        puts(g_strFoo);
     
        modifierGlobales();
        puts(g_strFoo);
     
        return 0;
    }

    5) Et enfin le header du main. Celui qui pose problème :
    Code Fichier main.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef MAIN_H
    #define MAIN_H
     
        #include <stdio.h>
     
        // A faire en second
        #include "appel.h"
     
        // A faire en premier
        #define INIT_GLOBALES
        #include "globales.h"
     
    #endif

    Les commentaires parlent d'eux mêmes : si je fais dans le bon ordre, ça link ; dans le mauvais, ça ne link pas. Je vois d'où vient le problème : #include appel.h inclue le fichier "globales.h" avec les extern puisque INIT_GLOBALES n'est à ce moment pas défini. Donc les variables globales ne passent pas par la phase d'initialisation.

    Le seul truc, c'est que ça me gêne un peu de réfléchir à l'ordre d'inclusions de fichiers. J'estime que si c'était bien fait, je n'aurais pas à m'occuper de ça. Plusieurs questions se posent alors :

    1. Je respecte bien les règles d'inclusion des headers, au niveau des gardes ?
    2. Même pour le fichier main.h ?
    3. Le problème vient-il de la déclaration / définition des globales ?
    4. Comment faire alors ?


    Mon idée est qu'il faut définir les globales dans un fichier *.c et garder le coup du :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef SHARABLE_HEADER
    #define SHARABLE_HEADER
     
    #ifdef SHARABLE_PRIVATE
    #define EXTERN
    #else
    #define EXTERN extern
    #endif
     
    EXTERN int toto;
    EXTERN int tata;
     
    #undef EXTERN
    #endif
    Juste ou faux ?

    Encore merci pour vos éclaircissements

  14. #14
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    74
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 74
    Points : 41
    Points
    41
    Par défaut
    Alors ej ne suis pas un expert pour ce qui est respect des règles et autres, donc je ne peux pas te répondre.
    Par contre, une option pour garder ta première solution:

    Au début de ton main.c tu fais un:

    Et dans ton global.h, tu fais un:

    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
     
    #ifndef GLOBALES_H
    #define GLOBALES_H
     
     #ifdef MAIN_C
        #define EXTERN 
     #else
        #define EXTERN extern
     #endif
     
    #ifdef MAIN_C
        EXTERN int toto = 0;
        EXTERN int tata = 0xFF;
    #else
        EXTERN int toto;
        EXTERN int tata;
    #endif
     
     
    #endif
    Dans ce cas la, quand le main est compilé, les variables ne sont pas en externes et sont initialisées, et sinon non!!

  15. #15
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Mouais mouais mouais.... J'ai appliqué cette technique et j'ai passé une heure à comprendre pourquoi mon projet ne voulait plus linker. J'ai réussi à le faire linker, mais c'est un peu du bricolage.
    Si tu souhaites utiliser cette méthode, il ne faut pas définir INIT_GLOBALES dans un .h mais dans un et seul .c qui inclue globales.h et le define doit nécessairement être avant tout .h qui pourrait inclure globales.h.

  16. #16
    Membre expérimenté
    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
    Points : 1 351
    Points
    1 351
    Par défaut
    Citation Envoyé par Bktero Voir le message
    J'estime que si c'était bien fait, je n'aurais pas à m'occuper de ça.
    Tu as tout à fait raison. Ton premier post ne parlait pas d'initialiser une variable, mais de comprendre le EXTERN. Personnellement, je ferai comme ça pour le h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef SHARABLE_HEADER
    #define SHARABLE_HEADER
     
    //
    // section commune avec les typedef, protos de fonctions etc...
    //
     
    #ifndef SHARABLE_PRIVATE
    extern int toto;
    extern int tata;
    #endif
     
    #endif
    Et comme ca pour le c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define SHARABLE_PRIVATE
    #include "sharable.h"
     
    int toto = 0;
    int tata = 0;
    Ça permet de mettre dans le h tout ce qui est prototype de fonctions, typedef et define, mais ça oblige comme tu peux le constater à avoir 2 déclarations distinctes pour les variables globales, ce qui est je pense incontournable et lié aux globales. Ce n'est pas forcément la meilleure méthode (qui serait en fait de ne pas avoir de globales). S'il y a mieux, je suis preneur.

  17. #17
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par pfeuh Voir le message
    Tu as tout à fait raison. Ton premier post ne parlait pas d'initialiser une variable, mais de comprendre le EXTERN. Personnellement, je ferai comme ça pour le h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef SHARABLE_HEADER
    #define SHARABLE_HEADER
     
    //
    // section commune avec les typedef, protos de fonctions etc...
    //
     
    #ifndef SHARABLE_PRIVATE
    extern int toto;
    extern int tata;
    #endif
     
    #endif
    Et comme ca pour le c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #define SHARABLE_PRIVATE
    #include "sharable.h"
     
    int toto = 0;
    int tata = 0;
    SHARABLE_PRIVATE est totalement inutile ici (tu peux tout à fait avec la déclaration avec extern et la définition dans la même unité de compilation).

    Et c'est la méthode que j'avais expliqué dans le premier message, l'initialisation en plus (initialisation qui n'est d'ailleurs pas obligatoire dans le cas présent).

  18. #18
    Membre expérimenté
    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
    Points : 1 351
    Points
    1 351
    Par défaut
    Citation Envoyé par gl Voir le message
    tu peux tout à fait avec la déclaration avec extern et la définition dans la même unité de compilation
    Si je comprends bien ce que tu dis:

    Citation Envoyé par gl Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //global.h
    #ifndef GLOBAL_H
    #define GLOBAL_H
     
    extern int myGlobal;
     
    ...
     
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //global.c
    #include "global.h"
     
    int myGlobal;
     
    ...
    après le travail du préprocesseur, on va avoir dans "global.c" quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    extern int myGlobal;
    int myGlobal;
    Je pensais que le compilo ou le linker râlerait, mais non, je viens d'essayer.Merci gl, je viens d'apprendre quelque chose.

  19. #19
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    Au final, j'avais tenté hier soir la solution que vient de poster GL, à peu de chose près (je n'incluais pas "global.h" dans "global.c"). Ca semble le plus simple dans mon cas.


    Si je suis bien, ce code
    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
     
    #ifndef GLOBALES_H
    #define GLOBALES_H
     
     #ifdef MAIN_C
        #define EXTERN 
     #else
        #define EXTERN extern
     #endif
     
    #ifdef MAIN_C
        EXTERN int toto = 0;
        EXTERN int tata = 0xFF;
    #else
        EXTERN int toto;
        EXTERN int tata;
    #endif
     
     
    #endif
    , et en particulier le EXTERN, n'a pas d'intérêt non plus ?


    Le coup du EXTERN ne sert que si l'initialisation des variables est fait ailleurs (et pas au moment d'une déclaration) ?

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

Discussions similaires

  1. clé d'un Map formée par deux attributs
    Par kass28 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 14/05/2014, 09h18
  2. [EAR] Comment accèder à un EJB3 par deux EAR
    Par to_yoyo7 dans le forum Java EE
    Réponses: 1
    Dernier message: 13/11/2007, 14h27
  3. comment faire backgroud degrade par deux couleur
    Par h3d001 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 05/05/2007, 10h51
  4. Utiliser le même port série par deux applications
    Par homeostasie dans le forum Windows
    Réponses: 1
    Dernier message: 25/01/2007, 21h42
  5. [math] equ sinusoide passant par deux points
    Par ddams dans le forum Mathématiques
    Réponses: 11
    Dernier message: 24/05/2003, 14h12

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