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 :

Fonctions inline et erreur "multiple definition of "


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut Fonctions inline et erreur "multiple definition of "
    Bonjour

    Je déclare une fonction inline dans un .h protégé par le define classique pour
    éviter les inclusions multiples :

    Fichier inline.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef INLINE_H_
    #define INLINE_H_
     
    inline int inlineFunc(int x){return x;};
     
    #endif
    puis deux modules :
    module1.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include "inline.h"
     
    int s (){
    	return inlineFunc(3);
    }
    module2.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include "inline.h"
     
    int t (){
    	return inlineFunc(2);
    }
    Le tout étant linké dans un exe. A l'édition des liens, j'obtiens une erreur
    "multiple definition of `inlineFunc'"
    J'utilise eclipse, cdt, mingw.
    J'ai trouvé qq chose ici : http://gcc.gnu.org/gcc-4.3/porting_to.html
    mais en faisant ce qui me semble être expliqué (
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern inline __attribute__((__gnu_inline__)) int inlineFunc(int x){return x;};
    )
    j'obtiens un warning
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     warning: `__gnu_inline__' attribute directive ignored
    et des erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    module2.c:11: undefined reference to `inlineFunc'

    Une idée ?
    Merci
    Julien

  2. #2
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    As-tu essayer de forcer le compilateur à utiliser C99 en lui passer l'option -std=c99?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par qdaemon_fr Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef INLINE_H_
    #define INLINE_H_
     
    inline int inlineFunc(int x){return x;};
     
    #endif
    Il suffit d'enlever le ';' à la fin de la définition de la fonction. Ton fichier inline.h devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifndef INLINE_H_
    #define INLINE_H_
     
    inline int inlineFunc(int x)
    {
        return x;
    } /* -tc- Ici, j'ai enleve le ';' !!! */
     
    #endif
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  4. #4
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonjour,

    As tu essayé d'écrire un fichier fonc_inline.c, où tu définis ta fonction, et le fonc_inline.h, où tu la déclares en extern ?
    Code fonc_inline.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifndef FONC_INLINE_H_
    #define FONC_INLINE_H_
        extern inline int inlineFunc(int x) ;
    #endif
    Code fonc_inline.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include "fonc_inline.h"
    inline int inlineFunc(int x) { return x; }
    nota: Évite de prendre un nom de fichier inline.c/.h car le mot inline est réservé en C.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Il suffit d'enlever le ';' à la fin de la définition de la fonction. Ton fichier inline.h devient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifndef INLINE_H_
    #define INLINE_H_
     
    inline int inlineFunc(int x)
    {
        return x;
    } /* -tc- Ici, j'ai enleve le ';' !!! */
     
    #endif
    Thierry
    bouh, chez moi, ça le fait pas... Toujours la mm erreur.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 120
    Par défaut
    Bonjour

    Citation Envoyé par Elijha Voir le message
    Bonjour,

    As tu essayé d'écrire un fichier fonc_inline.c, où tu définis ta fonction, et le fonc_inline.h, où tu la déclares en extern ?
    Code fonc_inline.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifndef FONC_INLINE_H_
    #define FONC_INLINE_H_
        extern inline int inlineFunc(int x) ;
    #endif
    Code fonc_inline.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #include "fonc_inline.h"
    inline int inlineFunc(int x) { return x; }
    Je vais essayer mais je voudrais bien comprendre pourquoi cela ne compile
    pas ne l'état...
    Citation Envoyé par Elijha Voir le message
    nota: Évite de prendre un nom de fichier inline.c/.h car le mot inline est réservé en C.
    C'était pour l'exemple...

    Merci
    Julien

  7. #7
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    C'est parce qu'en définissant la fonction dans le .h, tu te retrouve avec deux fichiers objets, module1.o et module2.o, qui définissent et exportent la même fonction. Tu ne peux évidement pas linker deux objets qui exportent la même fonction, sinon comment savoir laquelle des deux appeler ?

    Ton exemple avec la définition fonctionnerait si tu définissait le fonction "static" dans le .h, mais ce n'est pas la bonne solution. Ce n'est plus une fonction inline, juste une fonction définie deux fois.

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    inline n'est pas une fonctionnalité que j'utilise tous les jours, car je n'ai pas l'habitude d'utiliser les outils proposés par C99. Une recherche dans la norme ainsi que sur des sites comme celui-ci montre qu'il y a une grande différence sémantique entre le inline C99 et le inline C++. Il semble que la bonne façon de procédé soit la suivante:

    1) La fonction suivante doit être déclarée dans un fichier d'entête est inclu dans les unités de compilation qui utilisent cette fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    inline int f(int x)
    {
        return x;
    }
    2) La déclaration externe suivante est réalisée dans exactement une unité de compilation (fichier .c):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern inline int f(int x);
    Comme beaucoup de fonctionnalités de C99, il semble que inline ne soit pas toujours implanté de manière conforme. C'est d'ailleurs la misère de beaucoup de fonctionnalités de C99 et la raison pour laquelle je me limite généralement à C90 si la portabilité du code est un enjeu.

    Avec mes meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  9. #9
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par qdaemon_fr Voir le message
    bouh, chez moi, ça le fait pas... Toujours la mm erreur.
    La norme dit cela:

    Citation Envoyé par ISO/IEC 9899:1999 §6.7.4/6
    Any function with internal linkage can be an inline function. For a function with external linkage, the following restrictions apply: If a function is declared with an inline function specifier, then it shall also be defined in the same translation unit. If all of the file scope declarations for a function in a translation unit include the inline function specifier without extern, then the definition in that translation unit is an inline definition. An inline definition does not provide an external definition for the function, and does not forbid an external definition in another translation unit. An inline definition provides an alternative to an external definition, which a translator may use to implement any call to the function in the same translation unit. It is unspecified whether a call to the function uses the inline definition or the external definition.
    La compilation n'a aucune raison de se plaindre que la fonction inline est définie dans plusieurs unités compilations. Si le compilateur utilisé est conforme, naturellement.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/05/2010, 13h18
  2. Fonctions inline et One definition rule.
    Par 3DArchi dans le forum Langage
    Réponses: 13
    Dernier message: 18/06/2009, 18h39
  3. "multiple definition of" pour une fonction.
    Par ikoria dans le forum Débuter
    Réponses: 3
    Dernier message: 20/01/2009, 10h47
  4. Erreur de "multiple definition"
    Par mess-mate dans le forum wxWidgets
    Réponses: 6
    Dernier message: 06/10/2008, 14h42
  5. Réponses: 8
    Dernier message: 19/09/2006, 15h42

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