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

Langage C++ Discussion :

déclaration extern "C"


Sujet :

Langage C++

  1. #1
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 20
    Par défaut déclaration extern "C"
    Bonjour,

    je doit intégrer du code dans mon projet c++. Hors ce code est généré en C et les fonctions sont déclarées comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern void fonction_generee()
    Lorsque j'essaie de compiler dans mon programme, le linker me renvoie une erreur :error LNK2019: unresolved external symbol ....

    Tout fonctionne si dans le code généré je remplace la déclaration par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifdef __cplusplus
    extern "C"
    #endif 
    void fonction_generee()
    Cependant je ne souhaite pas modifier le code généré. Savez vous s'il existe une alternative pour intégrer le code C sans le modifier?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    C'est curieux que vous n'ayez pas encore eu d'autre réponse.
    D'après ce que je sais, le mot clé "extern" pour une fonction est facultatif, ce qui signifie qu'il peut être là ou pas. Le contraire serait "static".
    Le prototype existe-t-il? en particulier dans un .h.
    Est-ce que cette fonction est appelée par une autre fonction qu'une fonction écrite en C.
    Ref. Mon bouquin
    Utilisez extern "c" pour empêcher que les noms de fonction soient substantypés dans des programmes C++.

  3. #3
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 20
    Par défaut
    Le prototype est dans un .h et est défini avec extern (sans "C"). Normalement elle est utilisée par du code c.
    Le problème est que je doit appeler cette fonction dans un programme en c++.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Essayez un truc:
    Faites une fonction qui ne fait qu'appeler celle qui est en C. Ca peut paraitre un peu lourd, mais de cette façon vous laissez le source C identique.
    Naturellement, le programme C++ appellera cette nouvelle fonction qui ne servira que d'intermédiaire.

  5. #5
    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 : 62
    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
    Par défaut
    Si tu ne veux pas modifier le source existant, (ce qui se conçoit), tu peux faire le truc suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifdef  __cplusplus
    extern "C" {
    #endif
     
    #include "mon include ecrit et compile en C.h"
     
    #ifdef  __cplusplus
    }
    #endif
    Cette modification est à faire dans tous les fichiers (.cpp ou .h) qui incluent le fichier "mon include ecrit et compile en C.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
    .

  6. #6
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 20
    Par défaut
    J'ai essayé cela fonctionne effectivement.
    Mais il faut alors déclarer un bridge par fonction ...
    Ceci di, c'est toujours mieux que de modifier le code généré à chaque fois

  7. #7
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 20
    Par défaut
    ram-0000 : Ok ca marche !!!!
    Ca me retire une sérieuse épine du pied.
    J'avais déjà essayé mais je n'avais pas pensé à mettre des accolades !!

    Merci à vous deux

  8. #8
    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 : 62
    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
    Par défaut
    Citation Envoyé par CrazyDev Voir le message
    J'avais déjà essayé mais je n'avais pas pensé à mettre des accolades !!
    Les accolades font partie de la syntaxe
    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
    .

  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 : 62
    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
    Par défaut
    Ceci dit, une autre idée moins sale, serait de créer un .h dédié (interface.h par exemple) et de mettre dedans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifdef  __cplusplus
    extern "C" {
    #endif
     
    #include "mon include ecrit et compile en C.h"
     
    #ifdef  __cplusplus
    }
    #endif
    Ainsi dans ton code, tu n'as plus qu'a inclure le fichier interface.h (et non plus "mon include ecrit et compile en C.h"). Au moins, le code sale est localisé à un seul endroit.
    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
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 461
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Le prototype existe-t-il? en particulier dans un .h.
    Est-ce que cette fonction est appelée par une autre fonction qu'une fonction écrite en C.
    Le problème vient du fait que le code est compilé par un compilateur C++ (normal, dans le cas présent). Comme, en C++, les fonctions peuvent être surchargées, et/ou appertenir à des namespaces ou des classes, ces noms sont « décorés » dans l'ABI avec tout un tas d'informations supplémentaires, ce qui n'est pas le cas en C.

    Si tu te contentes de spécifier le prototype, le compilateur fera référence à un nom externe décoré, que le linker ne trouvera évidemment pas si la fonction correspondante a été compilée en C. Le cas échéant, il faut donc le préciser explicitement au compilateur C++ avec « extern "C" ».

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

Discussions similaires

  1. à quoi servent "extern" et "__cplusplus"
    Par yashiro dans le forum C++
    Réponses: 3
    Dernier message: 30/03/2006, 21h58

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