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 :

[Pointeurs de fonctions] Interfaçage avec le C


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut [Pointeurs de fonctions] Interfaçage avec le C
    Bonjour,

    Pour réaliser mes bindings entre C++ et OCaml, j'utilise l'interface C fournie avec la distribution.

    Comme il y a un Garbage Collector dans OCaml, si j'utilise une classe non POD, il faut fournir une fonction de finalisation.

    Le problème, c'est que j'utilise une fonction de finalisation template.
    Vis-à-vis de l'interface C, je me demandais si ça posait pas de problème de donner l'adresse d'une fonction template (instanciée bien sûr) à une fonction C ?

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je ne vois pas trop de problèmes a priori, même si je serais bien surpris que quoi que ce soit garantisse ce genre de fonctionnement.

    Le seul cas tordu auquel je pense serait un compilateur qui n'aurait pas la même convention de passage de paramètres en C et en C++, ce qui ferait qu'à un code C, tu ne pourrais passer un pointeur de fonction C++ que si cette dernière était déclarée extern "C".
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Je ne vois pas trop de problèmes a priori, même si je serais bien surpris que quoi que ce soit garantisse ce genre de fonctionnement.

    Le seul cas tordu auquel je pense serait un compilateur qui n'aurait pas la même convention de passage de paramètres en C et en C++, ce qui ferait qu'à un code C, tu ne pourrais passer un pointeur de fonction C++ que si cette dernière était déclarée extern "C".
    C'est justement ce dernier cas que je crains.

    Comment faire alors ? Boost.Python a surement du rencontrer ce problème. Avec la bibliothèque de préprocessing de Boost pour générer des extern "C" à la volée peut-être ?

  4. #4
    Membre expérimenté Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Je ne vois pas trop de problèmes a priori, même si je serais bien surpris que quoi que ce soit garantisse ce genre de fonctionnement.

    Le seul cas tordu auquel je pense serait un compilateur qui n'aurait pas la même convention de passage de paramètres en C et en C++, ce qui ferait qu'à un code C, tu ne pourrais passer un pointeur de fonction C++ que si cette dernière était déclarée extern "C".
    Les conventions de parametres en c++ ne sont plus forcement les même qu'en c, normalement pas de difference d'apres ce que j'en ai lu, mais sous visual c++, 3 conventions possibles en c++ : __cdecl( standard c), __stdcall( standard win32 c++), __fastcall( non standard).

    Donc ça va effectivement dependre du compilateur, donc il faut tester et voir ce que ça donne.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour les fonctions libres ou statiques, sous Windows il n'y a aucune différence entre C et C++ : Les deux n'utilisent que les trois conventions d'appel __cdecl, __stdcall et __fastcall.
    Par contre, une fonction membre non-statique d'une classe est en thiscall si on ne spécifie pas une autre convention (c'est le cas notamment pour les interfaces COM, dont les fonctions membres sont en __stdcall pour être utilisables en C).


    Sous d'autres OS, aucune garantie que je connaisse (mais je ne connais pas les normes par coeur). C'est ce qui fait qu'un typedef de pointeur de fonction peut être ou non dans un bloc extern "C" {}...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    OK. En fait, je pense que c'est pas trop un problème : sous VC++ on peut forcer la convention d'appel des fonctions libres en __cdecl.

    Je sais pas pour g++, mais je suppose que si les signatures étaient les mêmes, j'aurais eu une erreur.

    On va dire que c'est résolu.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    À l'intérieur même d'un programme C ou C++, toutes les fonctions libres sont généralement en __cdecl (et les fonctions membres non-statiques en thiscall).
    D'ailleurs, le compilateur choisit __cdecl par défaut si on ne lui dit pas de faire autrement (il compile en /Gd par défaut).

    Par contre, les fonctions exportées par une DLL sont généralement explicitement déclarées en __stdcall, pour pouvoir être appelées depuis un autre langage que C ou C++ (notamment VB).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. [WD10] Utiliser une fonction OpenGL avec pointeur (int)
    Par Zoons dans le forum WinDev
    Réponses: 3
    Dernier message: 06/07/2006, 16h38
  2. [Debutante] Fonction recursive avec un pointeur
    Par kidney dans le forum Débuter
    Réponses: 9
    Dernier message: 25/03/2006, 08h08
  3. Comment fait ça avec les pointeurs, la fonction et les struc
    Par mahdianis dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 24/02/2006, 18h01
  4. Pointeur sur fonction membre avec parametre
    Par Glosialabolas dans le forum C++
    Réponses: 7
    Dernier message: 06/02/2006, 02h32
  5. Réponses: 5
    Dernier message: 12/01/2005, 20h58

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