James Kanze a écrit : > On Sep 15, 9:39 am, Michael DOUBEZ wrote: >> Sylvain SF a écrit :
>>> Sylvain SF wrote on 15/09/2008 03:35: >>> la convention d'appel est imposé comme "nettoyage par la >>> fonction" mais la méthode statique passé en paramètre à >>> "CreateThread" (création d'un thread selon MS) n'est pas >>> déclarée 'extern "C"'. >> Je ne comprends toujours pas le problème. Si l'ABI est la >> même[...]
> C'est là précisement la question. Du point du vue de la > norme, c'est le linkage qui détermine l'ABI ; le C et le C++ > ne sont pas obligé à avoir le même linkage (et en partie, ne > peut l'avoir, puisque l'ABI du C++ précise aussi > l'organisation de la vtable, etc.). De même, Microsoft offre > plusieurs linkage différents (avec des ABI différentes) en > guise d'extension.
Dans ce cas, comment appeler du C++ à partir du C ? Si je me souviens bien, il n'y a pas de moyen portable de faire cela (pas de extern "c++" dans la norme C).
A moins d'une particularité de compilateur (un pragma?), il faut dont bien à un moment que les ABI communiquent de C vers C++ sinon la norme POSIX ne sers plus à rien.
Ça peut se faire au moyen d'une extension en C (pragma ou autre). Mais les compilateurs C que je connais ne savent générer que des appels aux conventions C. C'est donc à l'autre langage de s'adapter. En C++, si tu déclares une fonction avec linkage C, elle utilise les conventions C ; elle peut donc être appelée depuis le C (ou par n'importe quel code respectant les conventions C).
Quant à Posix, il ne connaît que le C aussi. Donc, tout ce qui touche à Posix doit avoir un linkage "C". C'était précisement le point de démarrage de ce sous-thread : il faut que la fonction dont tu donnes l'adresse à pthread_create ait un linkage "C".
>> alors les convention d'appel sont respectées et, à moins >> que l'exception ne se propage jusqu'à la couche POSIX, il >> n'y a pas de problème.
> Mais les conventions d'appel dépendent du linkage. Je me suis > bien servi des compilateurs où les conventions étaient > différentes entre le C et le C++.
Dans ce là, comment est ce que ça se passe? Est ce que certaines fonctions sont exportées avec une ABI différente ou est ce qu'il faut spécifier l'ABI de la fonction à utiliser ?
Si la fonction a un linkage "C++" (le défaut), le compilateur génère un appel avec les conventions C++. Si la fonction a un linkage "C", il génère un appel avec les conventions C.
C'est justement le but du linkage. Mais du coup, le linkage fait partie du type, y compris du type d'un pointeur à fonction. Si un pointeur à fonction a un linkage "C", tu ne peux lui affecter que des adresses des fonctions à linkage "C", et quand le compilateur génère un appel de fonction à travers ce pointeur, il utilise les conventions C (mais la plupart du temps, on passe de tels pointeurs à du C, qui lui appelle la fonction).
-- James Kanze (GABI Software) email: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
On Sep 16, 9:28 am, Michael DOUBEZ <michael.dou...@free.fr> wrote:
James Kanze a écrit :
> On Sep 15, 9:39 am, Michael DOUBEZ <michael.dou...@free.fr> wrote:
>> Sylvain SF a écrit :
>>> Sylvain SF wrote on 15/09/2008 03:35:
>>> la convention d'appel est imposé comme "nettoyage par la
>>> fonction" mais la méthode statique passé en paramètre à
>>> "CreateThread" (création d'un thread selon MS) n'est pas
>>> déclarée 'extern "C"'.
>> Je ne comprends toujours pas le problème. Si l'ABI est la
>> même[...]
> C'est là précisement la question. Du point du vue de la
> norme, c'est le linkage qui détermine l'ABI ; le C et le C++
> ne sont pas obligé à avoir le même linkage (et en partie, ne
> peut l'avoir, puisque l'ABI du C++ précise aussi
> l'organisation de la vtable, etc.). De même, Microsoft offre
> plusieurs linkage différents (avec des ABI différentes) en
> guise d'extension.
Dans ce cas, comment appeler du C++ à partir du C ? Si je me
souviens bien, il n'y a pas de moyen portable de faire cela
(pas de extern "c++" dans la norme C).
A moins d'une particularité de compilateur (un pragma?), il
faut dont bien à un moment que les ABI communiquent de C vers
C++ sinon la norme POSIX ne sers plus à rien.
Ça peut se faire au moyen d'une extension en C (pragma ou
autre). Mais les compilateurs C que je connais ne savent générer
que des appels aux conventions C. C'est donc à l'autre langage
de s'adapter. En C++, si tu déclares une fonction avec linkage
C, elle utilise les conventions C ; elle peut donc être appelée
depuis le C (ou par n'importe quel code respectant les
conventions C).
Quant à Posix, il ne connaît que le C aussi. Donc, tout ce qui
touche à Posix doit avoir un linkage "C". C'était précisement le
point de démarrage de ce sous-thread : il faut que la fonction
dont tu donnes l'adresse à pthread_create ait un linkage "C".
>> alors les convention d'appel sont respectées et, à moins
>> que l'exception ne se propage jusqu'à la couche POSIX, il
>> n'y a pas de problème.
> Mais les conventions d'appel dépendent du linkage. Je me suis
> bien servi des compilateurs où les conventions étaient
> différentes entre le C et le C++.
Dans ce là, comment est ce que ça se passe? Est ce que
certaines fonctions sont exportées avec une ABI différente ou
est ce qu'il faut spécifier l'ABI de la fonction à utiliser ?
Si la fonction a un linkage "C++" (le défaut), le compilateur
génère un appel avec les conventions C++. Si la fonction a un
linkage "C", il génère un appel avec les conventions C.
C'est justement le but du linkage. Mais du coup, le linkage fait
partie du type, y compris du type d'un pointeur à fonction. Si
un pointeur à fonction a un linkage "C", tu ne peux lui affecter
que des adresses des fonctions à linkage "C", et quand le
compilateur génère un appel de fonction à travers ce pointeur,
il utilise les conventions C (mais la plupart du temps, on passe
de tels pointeurs à du C, qui lui appelle la fonction).
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
James Kanze a écrit : > On Sep 15, 9:39 am, Michael DOUBEZ wrote: >> Sylvain SF a écrit :
>>> Sylvain SF wrote on 15/09/2008 03:35: >>> la convention d'appel est imposé comme "nettoyage par la >>> fonction" mais la méthode statique passé en paramètre à >>> "CreateThread" (création d'un thread selon MS) n'est pas >>> déclarée 'extern "C"'. >> Je ne comprends toujours pas le problème. Si l'ABI est la >> même[...]
> C'est là précisement la question. Du point du vue de la > norme, c'est le linkage qui détermine l'ABI ; le C et le C++ > ne sont pas obligé à avoir le même linkage (et en partie, ne > peut l'avoir, puisque l'ABI du C++ précise aussi > l'organisation de la vtable, etc.). De même, Microsoft offre > plusieurs linkage différents (avec des ABI différentes) en > guise d'extension.
Dans ce cas, comment appeler du C++ à partir du C ? Si je me souviens bien, il n'y a pas de moyen portable de faire cela (pas de extern "c++" dans la norme C).
A moins d'une particularité de compilateur (un pragma?), il faut dont bien à un moment que les ABI communiquent de C vers C++ sinon la norme POSIX ne sers plus à rien.
Ça peut se faire au moyen d'une extension en C (pragma ou autre). Mais les compilateurs C que je connais ne savent générer que des appels aux conventions C. C'est donc à l'autre langage de s'adapter. En C++, si tu déclares une fonction avec linkage C, elle utilise les conventions C ; elle peut donc être appelée depuis le C (ou par n'importe quel code respectant les conventions C).
Quant à Posix, il ne connaît que le C aussi. Donc, tout ce qui touche à Posix doit avoir un linkage "C". C'était précisement le point de démarrage de ce sous-thread : il faut que la fonction dont tu donnes l'adresse à pthread_create ait un linkage "C".
>> alors les convention d'appel sont respectées et, à moins >> que l'exception ne se propage jusqu'à la couche POSIX, il >> n'y a pas de problème.
> Mais les conventions d'appel dépendent du linkage. Je me suis > bien servi des compilateurs où les conventions étaient > différentes entre le C et le C++.
Dans ce là, comment est ce que ça se passe? Est ce que certaines fonctions sont exportées avec une ABI différente ou est ce qu'il faut spécifier l'ABI de la fonction à utiliser ?
Si la fonction a un linkage "C++" (le défaut), le compilateur génère un appel avec les conventions C++. Si la fonction a un linkage "C", il génère un appel avec les conventions C.
C'est justement le but du linkage. Mais du coup, le linkage fait partie du type, y compris du type d'un pointeur à fonction. Si un pointeur à fonction a un linkage "C", tu ne peux lui affecter que des adresses des fonctions à linkage "C", et quand le compilateur génère un appel de fonction à travers ce pointeur, il utilise les conventions C (mais la plupart du temps, on passe de tels pointeurs à du C, qui lui appelle la fonction).
-- James Kanze (GABI Software) email: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34