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 :

Pointeur vers fonction membre


Sujet :

C++

  1. #1
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut Pointeur vers fonction membre
    Bonjour à tous,

    Aujourd'hui, je sèche sur un problème relativement simple avec boost::bind. Ca fait 1 heure que je sèche et ça m'énerve. La fatigue me direz-vous... Sans doute !

    Vois un exemple de code minimal qui reproduit mon problème : je cherche à appeler un callback membre avec une signature spécifique. La classe Agent provient d'une bibliothèque tierce qui appelle une fonction ayant un prototype précis (Agent::Func ici) pour passer les infos.
    Le seul truc que je peux toucher, c'est ma classe Test !
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    #include <iostream>
    #include <boost/bind.hpp>
     
    struct foo {};
    struct bar {};
     
    void free_callback(foo*, bar*)
    {}
     
    class Agent
    {
    public:
    	typedef void (*Func)( foo*, bar* );
     
    	virtual bool Initialize ( const char* name, Agent::Func p_func = NULL ) {}
    };
     
    class Test
    {
    public:
    	Test()
    	{
    		m_agent = new Agent;
    		m_agent->Initialize("mon_agent", free_callback); // OK
    		m_agent->Initialize("mon_agent", boost::bind(&Test::CallBack, this, _1, _2) ); // KO
    	}
    	~Test()
    	{
    		delete m_agent;
    	}
     
    private:
    	void CallBack(foo*, bar*);
     
    	Agent* m_agent;
    };
     
    int main()
    {
        return 0;
    }
    Compilo :
    error C2664: 'Agent::Initialize'*: impossible de convertir le paramètre 2 de 'boost::_bi::bind_t<R,F,L>' en 'Agent::Func'

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Le type construit par l'appel à boost::bind n'est pas de type Agent::Func mais de type implementation-defined.
    Tu peux remplacer Agent::Func par un boost::function< void( foo*, bar* ) > pour que ça fonctionne.

    MAT.

  3. #3
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Salut Mat !
    Arg, j'ai oublié de préciser. Je ne maitrise PAS la class Agent, elle vient d'une autre bibliothèque !

    EDIT: je crois avoir trouvé un début de solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Test()
    {
    	m_agent = new Agent;
    	m_agent->Initialize("mon_agent", free_callback); // OK
    	boost::function<void(foo*, bar*)> f = boost::bind(&Test::CallBack, this, _1, _2);
    	Agent::Func* f2 = f.target<Agent::Func>();
    	m_agent->Initialize("mon_agent", *f2 ); // OK
    }
    Maintenant je sais pas trop ce que ça vaut...

    RE EDIT : ça vaut rien du tout....

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    C'est quoi la vraie signature de la callback ? Y'a pas un void* prévu pour passer des données utilisateur ?

    MAT.

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par poukill Voir le message
    je crois avoir trouvé un début de solution.
    Je ne pense pas que ça fonctionne, cf. http://lists.boost.org/Archives/boos.../12/145709.php par exemple.

    MAT.

  6. #6
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Je ne pense pas que ça fonctionne, cf. http://lists.boost.org/Archives/boos.../12/145709.php par exemple.

    MAT.
    Effectivement, ça ne marche pas du tout...
    http://stackoverflow.com/questions/2.../512233#512233 est un autre exemple....

    Du coup, je crois bien que je suis coincé...

    @MAT: la vraie signature de la callback est celle que j'ai montré. Sauf qu'évidement c'est pas foo et bar, mais ça ne change rien... J'attends un message d'une bibliothèque tierce vers une fonction avec une signature spécifique !

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Et t'as pas moyen de convaincre les auteurs de Agent qu'il faut au moins un void* sinon c'est pas très utilisable (sauf si Test est un singleton bien sûr mais bon...) ?

    MAT.

  8. #8
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Je suis d'accord, c'est quand même étrange que tu ne puisses pas avoir de données utilisateur à récupérer dans la callback. Ca fait perdre beaucoup de l'intérêt du système.
    Find me on github

  9. #9
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Et t'as pas moyen de convaincre les auteurs de Agent qu'il faut au moins un void* sinon c'est pas très utilisable (sauf si Test est un singleton bien sûr mais bon...) ?
    MAT.
    Si y'a moyen, je peux avoir des contacts avec. C'est pas super simple, mais c'est très faisable.
    Test n'est pas un singleton, en effet, mais il pourrait le devenir si je trouve pas de solutions et que ça m'arrange... Parce que là, si j'arrive pas à mettre une fonction membre en callback, le code va vite devenir très moche (variable globale et tout). Ce que je voudrais vraiment éviter.

    Citation Envoyé par jblecanard Voir le message
    Je suis d'accord, c'est quand même étrange que tu ne puisses pas avoir de données utilisateur à récupérer dans la callback. Ca fait perdre beaucoup de l'intérêt du système.
    Well, je suis pas sûr de comprendre ce que vous avancez tous les 2!
    En fait, je vois pas en quoi le void* m'aiderait. A partir du moment où une signature est imposée, je suis marron. Le paramètre implicite "this" me casse en deux. Je pense pas que le void* peut améliorer la chose. Si?
    Pour développer un peu, la bibliothèque tierce avec l'Agent en question est une façade pour un système de communication middleware DDS. Là, ma classe "Test" veut juste écouter un certain type de message, et éventuellement en émettre quelques uns. Mais comme les messages sont très "formalisés" (structures complètement définies à l'avance, avant la compilation), ben y'a pas vraiment de données ou type utilisateur. Je sais pas si je suis très clair...
    En tout cas, merci bien pour le coup de main !

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par poukill Voir le message
    En fait, je vois pas en quoi le void* m'aiderait.
    En général en C lorsqu'on positionne une callback on passe un paramètre utilisateur que l'on va ensuite recevoir lors de l'appel de la callback, pour justement gérer un contexte d'appel.
    Et comme c'est du C, c'est souvent un void*.

    Du coup là en plus du pointeur de fonction tu passerais l'instance de Test en faisant un transtypage vers un void*, que tu récupérerais dans l'appel de la callback et que tu pourrais transtyper dans l'autre sens en Test*.

    Mais bon là en fait c'est du C++ donc ils devraient accepter une callback sous la forme d'une interface (genre classe virtuelle pure, et tout ça...).

    MAT.

  11. #11
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Mais bon là en fait c'est du C++ donc ils devraient accepter une callback sous la forme d'une interface (genre classe virtuelle pure, et tout ça...).
    Ou un boost.function dans nos rêves les plus fous
    Find me on github

  12. #12
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Ok, je comprends.
    Au passage, je me rends compte que j'ai probablement mal nommé ma fonction. En réalité c'est pas vraiment une callback puisque il n'y a pas vraiment d'appel préalable. En fait, on s'enregistre à la manière du pattern observer sur un domaine, et on attend des messages qui peuvent arriver à n'importe quel moment.
    Dans tous les cas, c'est vrai que la manière C++ de faire les choses c'est :
    • une classe abstraite avec un membre virtuel pur
    • boost.Signals
    • boost.Function
    .
    Bon bah là j'ai aucun des 3, j'ai tout gagné !

    Je me pose une question quand même : est-ce que les 3 solutions que je viens de mentionner fonctionnent en exportation via une DLL de manière portable ? i.e pas de problèmes de mangling, couple new/delete, etc... (cf discussion ICI )
    Si c'est faisable, alors il ne me reste plus qu'à contacter l'équipe de dev pour négocier une meilleure interface.

  13. #13
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par poukill Voir le message
    est-ce que les 3 solutions que je viens de mentionner fonctionnent en exportation via une DLL de manière portable ?
    Les deux dernières non et la première sans doute mais peut-être pas (et réciproquement).
    Si vraiment il faut que ça soit portable-portable alors il faut du C (et un void*).

    MAT.

  14. #14
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Les deux dernières non et la première sans doute mais peut-être pas (et réciproquement).
    Si vraiment il faut que ça soit portable-portable alors il faut du C (et un void*).

    MAT.
    Grrrrr, j'avais peur de cette réponse.

    Mais quand même, une simple interface comme celle là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class IObserver
    {
    public:
        virtual void Notify(foo*, bar*) = 0;
    };
    Avec éventuellement foo* et bar* en pointeur intelligent pour que la libération se fasse dans la DLL (ou alors via un foo->Delete() ).
    Ca ne devrait pas poser problème, c'est simplissime.
    D'après cet article, ça devrait marcher !

    Good news, non ?

  15. #15
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Pas possible, même une interface simple comme ça.

    Si le code est compilé avec deux compilateurs différents, rien ne dit que

    * les deux compilateurs vont utiliser une vtable
    * la structure de la vtable sera la même
    * la vtable s'utilise de la même manière
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  16. #16
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    OK.
    Et livrer la DLL compilé avec n compilateurs, sur windows et linux, c'est une utopie c'est ça ?
    Genre gcc 4.4.3 et gcc 4.4.4 c'est pas garanti non plus ?

  17. #17
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par poukill Voir le message
    OK.
    Et livrer la DLL compilé avec n compilateurs, sur windows et linux, c'est une utopie c'est ça ?
    Genre gcc 4.4.3 et gcc 4.4.4 c'est pas garanti non plus ?
    Dans le principe, non ; en pratique, c'est fort probable que ça fonctionne quand même - il y a peu de chance que d'une version mineure à l'autre, les changements dans l'ABI C++ soient si importants qu'ils provoque une incompatibilité totale ; d'ailleurs, il faut quand même pouvoir linker le code fait avec g++4.3 et celui compilé avec g++4.4 - et si ça marche pour les librairies statiques, alors il y a des chances que ça marche pour les .so.

    Le même genre de remarque est valable pour Visual C++ : un programme compilé avec la version 2003+ a de bonne chance de pouvoir importer des plugins de la version 2010, à condition que les allocation/libération de mémoire n'entrent pas en concurrence (la mémoire allouée par un module (au sens Windows, c'est à dire disposant d'un HMODULE au runtime) est libérée par ce même module).

    Mais il faut savoir que le standard ne garanti rien, et que c'est un détails d'implémentation choisi par le vendeur - il peut où non le modifier par la suite.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  18. #18
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Citation Envoyé par Emmanuel Deloget Voir le message
    Dans le principe, non ; en pratique, c'est fort probable que ça fonctionne quand même - il y a peu de chance que d'une version mineure à l'autre, les changements dans l'ABI C++ soient si importants qu'ils provoque une incompatibilité totale ; d'ailleurs, il faut quand même pouvoir linker le code fait avec g++4.3 et celui compilé avec g++4.4 - et si ça marche pour les librairies statiques, alors il y a des chances que ça marche pour les .so.

    Le même genre de remarque est valable pour Visual C++ : un programme compilé avec la version 2003+ a de bonne chance de pouvoir importer des plugins de la version 2010, à condition que les allocation/libération de mémoire n'entrent pas en concurrence (la mémoire allouée par un module (au sens Windows, c'est à dire disposant d'un HMODULE au runtime) est libérée par ce même module).

    Mais il faut savoir que le standard ne garanti rien, et que c'est un détails d'implémentation choisi par le vendeur - il peut où non le modifier par la suite.
    Si on est obligé de faire du C pur pour utiliser des .DLL / .so, moi j'abandonne!
    Pourtant dans l'article que j'avais cité, le gars explique qu'en C++ on peut exporter sans crainte une interface C++ sans variables membres. A condition que les paramètres soient des POD, ou bien eux même des interfaces abstraites.
    Ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // The abstract interface for Xyz object.
    // No extra specifiers required.
    struct IXyz
    {
        virtual int Foo(int n) = 0;
        virtual void Release() = 0;
    };
     
    // Factory function that creates instances of the Xyz object.
    extern "C" XYZAPI IXyz* APIENTRY GetXyz();
    fait ce qu'on lui demande correctement. En encapsulant soi-même le IXyz::Release comme fonction de nettoyage dans un shared_ptr, on reste C++ avec même un peu de RAII en prime !

    Moi j'ai l'impression que cette voie est une porte de sortie pour moi pour gérer cette interface contraignante Agent (cf mon premier post). Après, il faut voir ce que voulait exactement dire l'auteur par interface abstraite dans le prototype des fonctions. C'est là que ça peut coincer AMHA.

    Je raconte n'importe quoi ou ça un sens ce que je dis ?

  19. #19
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Généralement, ce type d'article est écrit par des gens qui vont tester sur Visual, puis sur g++, mais jamais en croisé.

    Comme je l'ai dit plus haut, rien de garanti que les deux compilateurs vont traiter de la même manière les classes abstraites. Par exemple, VC++ mets une vtable, dont la taille est sizeof(R C::*)()) * nombre de fonction virtuelle, à l'adresse de l'objet, typiquement gardée dans le registre ecx. Lorsqu'on appelle une fonction virtuelle, le compilateur prends son index, et compose l'adresse d'appel grâce à ecx. Il effectue ensuite un jmp à l'adresse trouvée en release ; en debug il fait des tas d'autres choses mais le protocole d'appel est compatible. Du coup, en release, l'appel à une méthode virtualle coute le coût de l'appel à une fonction normale + un mov + jmp (c'est relativement bien optimisé).

    Si g++ fait exactement la même chose, alors les DLL produites pourront être compatibles. Mais qu se passe-t-il si g++ garde le pointeur de l'objet dans un autre registre ? Que se passe-t-il si la pile n'est pas gérée de la même manière (par exemple, un compilateur, en mode optimisation, passe un des arguments via un registre car la fonction consiste essentiellement à modifier la valeur passée et à la retourner. Par exemple, une fonction qui fait square(x) ou x est un entier pourrait très bien être optimisée ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // protocole d'entrée supprimé
    // le compilateur sait qu'il a directement mis la valeur de x dans eax
    // eax est aussi le registre dans lequel on stocke typiquement la valeur de
    // retour
    mul eax,eax,eax
    ret
    Que faire si, ignorant cette optimisation, l'autre compilateur génère un appel à sq en passant x via la pile ?

    Il y a trop de problèmes à suivre, trop de cas tordus à vérifier ; j'envie celui qui a trouvé le temps de vérifier tout ça - sur VS2003, VS2005, VS2008, VS2010, g++ 4.0 à g++ 4.6 (comme ce sont des détails d'implémentation, des versions différentes peuvent quand même gérer les choses légèrement différemment).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  20. #20
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par poukill Voir le message
    Genre gcc 4.4.3 et gcc 4.4.4 c'est pas garanti non plus ?
    gcc suit un ABI normalisé pour le C++, il y a de l'interopérabilité avec les autres compilateurs qui le suivent (au moins celui d'Intel pour Linux).

    Voir http://gcc.gnu.org/onlinedocs/gcc/Compatibility.html

    Et pour la lib standard:

    http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 10
    Dernier message: 28/08/2008, 18h15
  2. Pointeur de fonction membre
    Par legend666 dans le forum C++
    Réponses: 1
    Dernier message: 04/10/2005, 20h46
  3. Pointeur vers fonction
    Par flopaname dans le forum Langage
    Réponses: 3
    Dernier message: 23/06/2005, 15h46
  4. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  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