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 :

Initialisation d'une constante dans un .h utilisé par plusieurs .c


Sujet :

C

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 81
    Points : 61
    Points
    61
    Par défaut Initialisation d'une constante dans un .h utilisé par plusieurs .c
    Bonjour,

    Comme le défini le titre, je souhaite déclarer une constante (plus précisément un tableau de constante) dans un header (.h).
    Cependant, cet header est utilisé pour compiler plusieurs projets.
    Par conséquent, j'ai le problème suivant :
    lors de la compilation : "multiple definition of 'ma_constante'"

    Dans ce post, on parle d'une variable, est-ce le même problème pour une constante ?

    Je voudrais au final avoir la déclaration et donc l'initialisation de mon tableau de constantes dans le même header. Est-ce possible ?

    Cordialement,
    Xpmich

  2. #2
    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
    Tout d'abord, déclarer une variable, cela signifie dire au compilateur que cette variables existe quelque part, qu'il n'a pas en s'en soucier.

    Définir une variable indique au compilateur de créer un espace en mémoire pour loger cette variable. Après, cette définition peut être suivie d'une initialisation ou non.

    Il est recommandé de ne pas définir de variables dans un .h justement pour éviter le problème que tu rencontres, à savoir "multiple definition of 'ma_constante'"

    Dans ce cas, il faut créer un .h et écrire dedans toutes les déclarations de variables et un .c dans lequel tu définis et initialises si nécessaire tes variables.

    Maintenant, tu parle de constantes. Une constante est une variable qui ne peut ou ne doit être modifiée. Pour cela, elle est protégée par le mot clé "const" qui indique au compilateur de faire des contrôles supplémentaires pour vérifier cette contrainte.

    Et enfin, pour résoudre ton problème, c'est à dire avoir la définition et la déclaration + initialisation dans le même fichier .h, il y a une méthode sale que j'ai déjà vue mais que je ne conseillerai pas :

    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 _include_header_h
    #define _include_header_h
     
    extern const int ma_variable1;
    extern const char *ma_variable2;
     
    #ifdef WANT_DEFINITION
     
    const int ma_variable1 = 12;
    const char *ma_variable2 = "toto";
     
    #endif /* #ifdef WANT_DEFINITION */
     
    #endif /* #ifndef _include_header_h */
    Cette manière de faire demande à ce que WANT_DEFINITION soit défini une fois et une seule fois (par un #define) dans un des fichiers .c de l'application juste avant d'inclure le fichier header.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
    .

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    81
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 81
    Points : 61
    Points
    61
    Par défaut
    Bonjour,
    ok

    donc il n'est pas possible de déclarer une constante dans un header utilisé à plusieurs compilations sauf par le cas évoqué plus haut.

    Merci.

    Xpmich

  4. #4
    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 Xpmich Voir le message
    donc il n'est pas possible de déclarer une constante dans un header ...
    Déclarer, si. Définir, non
    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
    .

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 037
    Points
    31 037
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Xpmich Voir le message
    Bonjour,

    Comme le défini le titre, je souhaite déclarer une constante (plus précisément un tableau de constante) dans un header (.h).
    Cependant, cet header est utilisé pour compiler plusieurs projets.
    Par conséquent, j'ai le problème suivant :
    lors de la compilation : "multiple definition of 'ma_constante'"
    Pas normal. Si tu as plusieurs projets (sous-entendu "indépendants donc avec chacun leur propre main), chaque compilation indépendante ne devrait pas avoir de souci avec les autres projets.

    Peut-être veux-tu dire "dans le projet j'ai plusieurs sources qui incluent le même header". Là effectivement, lors de l'édition de liens, ça va merder.

    Comment marche l'accès à une même variable globale:
    - chaque source .c déclare la variable en tant que "extern" => le source est compilable puisque la variable est connue
    - un seul source (généralement celui qui a le main()) défini la variable => à l'édition de lien l'ensemble des déclarations est regroupée en une variable unique

    Donc si tu inclues ta variable dans un ".h" appelé par tous les sources ben tu la mets en extern.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

Discussions similaires

  1. initialisation d'une constante dans le constructeur ?
    Par Lorenzo77 dans le forum ActionScript 3
    Réponses: 4
    Dernier message: 06/08/2009, 10h10
  2. Fixer une constante dans une fonction générée dynamiquement ?
    Par XecTech dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/08/2006, 20h59
  3. Utiliser une constante dans une requête
    Par Nabouille dans le forum Access
    Réponses: 4
    Dernier message: 19/04/2006, 13h09
  4. Réponses: 10
    Dernier message: 24/09/2005, 19h19
  5. ajout d'une constante dans un select
    Par Shabata dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/07/2004, 18h24

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