Le code dans leur exemple est faux, et un
compilateur C++ n'a pas le droit de l'accepter (selon la norme).
(En plus, il utilise un cast à la C, qui est interdit dans
beaucoup de standards de programmation.)
Le code dans leur exemple est faux, et un
compilateur C++ n'a pas le droit de l'accepter (selon la norme).
(En plus, il utilise un cast à la C, qui est interdit dans
beaucoup de standards de programmation.)
Le code dans leur exemple est faux, et un
compilateur C++ n'a pas le droit de l'accepter (selon la norme).
(En plus, il utilise un cast à la C, qui est interdit dans
beaucoup de standards de programmation.)
Delf wrote:James Kanze wrote:je ne connais même pas de solution portable : les fonctions
s'appelle dlopen, dlsym et dlclose sous Unix.
Je ne cherche pas à faire une application portable, qu'elle
fonctionne sous Linux et UNiX, ça ne sera déjà pas mal :)
Alors, il vaut mieux poser la question dans un groupe Unix. Ici,
on essaie toujours à être portable. [...]
http://www.faqs.org/docs/Linux-mini/C++-dlopen.html
Pour l'instant, mon PluginsManager basé sur ce document
fonctionne sous FreeBSD. Je testerai par la suite sous
d'autres systèmes Linux/UNiX.
Par hazard, peut-être. Le code dans leur exemple est faux, et un
compilateur C++ n'a pas le droit de l'accepter (selon la norme).
(En plus, il utilise un cast à la C, qui est interdit dans
beaucoup de standards de programmation.)
Delf wrote:
James Kanze wrote:
je ne connais même pas de solution portable : les fonctions
s'appelle dlopen, dlsym et dlclose sous Unix.
Je ne cherche pas à faire une application portable, qu'elle
fonctionne sous Linux et UNiX, ça ne sera déjà pas mal :)
Alors, il vaut mieux poser la question dans un groupe Unix. Ici,
on essaie toujours à être portable. [...]
http://www.faqs.org/docs/Linux-mini/C++-dlopen.html
Pour l'instant, mon PluginsManager basé sur ce document
fonctionne sous FreeBSD. Je testerai par la suite sous
d'autres systèmes Linux/UNiX.
Par hazard, peut-être. Le code dans leur exemple est faux, et un
compilateur C++ n'a pas le droit de l'accepter (selon la norme).
(En plus, il utilise un cast à la C, qui est interdit dans
beaucoup de standards de programmation.)
Delf wrote:James Kanze wrote:je ne connais même pas de solution portable : les fonctions
s'appelle dlopen, dlsym et dlclose sous Unix.
Je ne cherche pas à faire une application portable, qu'elle
fonctionne sous Linux et UNiX, ça ne sera déjà pas mal :)
Alors, il vaut mieux poser la question dans un groupe Unix. Ici,
on essaie toujours à être portable. [...]
http://www.faqs.org/docs/Linux-mini/C++-dlopen.html
Pour l'instant, mon PluginsManager basé sur ce document
fonctionne sous FreeBSD. Je testerai par la suite sous
d'autres systèmes Linux/UNiX.
Par hazard, peut-être. Le code dans leur exemple est faux, et un
compilateur C++ n'a pas le droit de l'accepter (selon la norme).
(En plus, il utilise un cast à la C, qui est interdit dans
beaucoup de standards de programmation.)
James Kanze wrote on 14/05/2006 17:17:http://www.faqs.org/docs/Linux-mini/C++-dlopen.html Pour
l'instant, mon PluginsManager basé sur ce document
fonctionne sous FreeBSD. Je testerai par la suite sous
d'autres systèmes Linux/UNiX.
Par hazard, peut-être. Le code dans leur exemple est faux,
et un compilateur C++ n'a pas le droit de l'accepter (selon
la norme). (En plus, il utilise un cast à la C, qui est
interdit dans beaucoup de standards de programmation.)
j'ai survolé le doc sans y voir ce qui est faux (ton propos
aurait pu utilement détailler l'erreur éventuelle).
au delà, un cast C est en effet appliqué sur les fonctions
exportées par la lib., mais quelle serait l'autre façon ??
sauf erreur un cast dynamique n'est possible (et/ou utile) que
si il existe des informations RTTI sur la chose castée - dès
lors cette chose a des RTTI s'il s'agit d'une instance, mais
pas s'il s'agit d'une fonction statique - j'ai omis quelque
chose ?
James Kanze wrote on 14/05/2006 17:17:
http://www.faqs.org/docs/Linux-mini/C++-dlopen.html Pour
l'instant, mon PluginsManager basé sur ce document
fonctionne sous FreeBSD. Je testerai par la suite sous
d'autres systèmes Linux/UNiX.
Par hazard, peut-être. Le code dans leur exemple est faux,
et un compilateur C++ n'a pas le droit de l'accepter (selon
la norme). (En plus, il utilise un cast à la C, qui est
interdit dans beaucoup de standards de programmation.)
j'ai survolé le doc sans y voir ce qui est faux (ton propos
aurait pu utilement détailler l'erreur éventuelle).
au delà, un cast C est en effet appliqué sur les fonctions
exportées par la lib., mais quelle serait l'autre façon ??
sauf erreur un cast dynamique n'est possible (et/ou utile) que
si il existe des informations RTTI sur la chose castée - dès
lors cette chose a des RTTI s'il s'agit d'une instance, mais
pas s'il s'agit d'une fonction statique - j'ai omis quelque
chose ?
James Kanze wrote on 14/05/2006 17:17:http://www.faqs.org/docs/Linux-mini/C++-dlopen.html Pour
l'instant, mon PluginsManager basé sur ce document
fonctionne sous FreeBSD. Je testerai par la suite sous
d'autres systèmes Linux/UNiX.
Par hazard, peut-être. Le code dans leur exemple est faux,
et un compilateur C++ n'a pas le droit de l'accepter (selon
la norme). (En plus, il utilise un cast à la C, qui est
interdit dans beaucoup de standards de programmation.)
j'ai survolé le doc sans y voir ce qui est faux (ton propos
aurait pu utilement détailler l'erreur éventuelle).
au delà, un cast C est en effet appliqué sur les fonctions
exportées par la lib., mais quelle serait l'autre façon ??
sauf erreur un cast dynamique n'est possible (et/ou utile) que
si il existe des informations RTTI sur la chose castée - dès
lors cette chose a des RTTI s'il s'agit d'une instance, mais
pas s'il s'agit d'une fonction statique - j'ai omis quelque
chose ?
"kanze" writes:
| Sylvain wrote:
| > James Kanze wrote on 14/05/2006 17:17:
| > > > http://www.faqs.org/docs/Linux-mini/C++-dlopen.html Pour
| > > > l'instant, mon PluginsManager basé sur ce document
| > > > fonctionne sous FreeBSD. Je testerai par la suite sous
| > > > d'autres systèmes Linux/UNiX.
| > > Par hazard, peut-être. Le code dans leur exemple est faux,
| > > et un compilateur C++ n'a pas le droit de l'accepter (selon
| > > la norme). (En plus, il utilise un cast à la C, qui est
| > > interdit dans beaucoup de standards de programmation.)
| > j'ai survolé le doc sans y voir ce qui est faux (ton propos
| > aurait pu utilement détailler l'erreur éventuelle).
| Ils invoquent une conversion d'un void* en pointeur à fonction,
| ce que supporte ni le C, ni le C++.
il sera permis dans C++, de « manière conditionnelle. »
[ La notion de « conditionally supported » a entraîné un débat
chauffé, surréaliste à la réunion de Lillehammer l'année
dernière. ]
[...]
| exemple. (Mais pas g++ -- pour des raisons qui me dépassent, gcc
| supporte le cast à la C, mais g++ ne supporte pas le
| reinterpret_cast.)
Alors, tu as trouvé un bug dans le compilateur.
"kanze" <kanze@gabi-soft.fr> writes:
| Sylvain wrote:
| > James Kanze wrote on 14/05/2006 17:17:
| > > > http://www.faqs.org/docs/Linux-mini/C++-dlopen.html Pour
| > > > l'instant, mon PluginsManager basé sur ce document
| > > > fonctionne sous FreeBSD. Je testerai par la suite sous
| > > > d'autres systèmes Linux/UNiX.
| > > Par hazard, peut-être. Le code dans leur exemple est faux,
| > > et un compilateur C++ n'a pas le droit de l'accepter (selon
| > > la norme). (En plus, il utilise un cast à la C, qui est
| > > interdit dans beaucoup de standards de programmation.)
| > j'ai survolé le doc sans y voir ce qui est faux (ton propos
| > aurait pu utilement détailler l'erreur éventuelle).
| Ils invoquent une conversion d'un void* en pointeur à fonction,
| ce que supporte ni le C, ni le C++.
il sera permis dans C++, de « manière conditionnelle. »
[ La notion de « conditionally supported » a entraîné un débat
chauffé, surréaliste à la réunion de Lillehammer l'année
dernière. ]
[...]
| exemple. (Mais pas g++ -- pour des raisons qui me dépassent, gcc
| supporte le cast à la C, mais g++ ne supporte pas le
| reinterpret_cast.)
Alors, tu as trouvé un bug dans le compilateur.
"kanze" writes:
| Sylvain wrote:
| > James Kanze wrote on 14/05/2006 17:17:
| > > > http://www.faqs.org/docs/Linux-mini/C++-dlopen.html Pour
| > > > l'instant, mon PluginsManager basé sur ce document
| > > > fonctionne sous FreeBSD. Je testerai par la suite sous
| > > > d'autres systèmes Linux/UNiX.
| > > Par hazard, peut-être. Le code dans leur exemple est faux,
| > > et un compilateur C++ n'a pas le droit de l'accepter (selon
| > > la norme). (En plus, il utilise un cast à la C, qui est
| > > interdit dans beaucoup de standards de programmation.)
| > j'ai survolé le doc sans y voir ce qui est faux (ton propos
| > aurait pu utilement détailler l'erreur éventuelle).
| Ils invoquent une conversion d'un void* en pointeur à fonction,
| ce que supporte ni le C, ni le C++.
il sera permis dans C++, de « manière conditionnelle. »
[ La notion de « conditionally supported » a entraîné un débat
chauffé, surréaliste à la réunion de Lillehammer l'année
dernière. ]
[...]
| exemple. (Mais pas g++ -- pour des raisons qui me dépassent, gcc
| supporte le cast à la C, mais g++ ne supporte pas le
| reinterpret_cast.)
Alors, tu as trouvé un bug dans le compilateur.
*(void **)(&fptr) = dlsym(handle, "my_function");
Ce qui en C++ donne :
*reinterpret_cast< void** >( &fptr ) = dlsym(handle, "my_function"
) ;
*(void **)(&fptr) = dlsym(handle, "my_function");
Ce qui en C++ donne :
*reinterpret_cast< void** >( &fptr ) = dlsym(handle, "my_function"
) ;
*(void **)(&fptr) = dlsym(handle, "my_function");
Ce qui en C++ donne :
*reinterpret_cast< void** >( &fptr ) = dlsym(handle, "my_function"
) ;
"kanze" writes:
[...]
| > [ La notion de « conditionally supported » a entraîné un dé bat
| > chauffé, surréaliste à la réunion de Lillehammer l'année
| > dernière. ]
| Mais ce n'est pas le premier cas d'une opération qui est
| « conditionally supported », non. Si je peux convertir un
| pointeur en entier (et quel entier), par exemple.
Cela n'est pas plutôt « implementation defined » ?
La notion de « conditionally supported » a été inventée à la
dernière réunion de Lillehammer.
| > [...]
| > | exemple. (Mais pas g++ -- pour des raisons qui me dépassent, gcc
| > | supporte le cast à la C, mais g++ ne supporte pas le
| > | reinterpret_cast.)
| > Alors, tu as trouvé un bug dans le compilateur.
| Moi, je le considèrerais comme tel, mais j'avais l'impression
| que c'était plus ou moins voulu.
Un cast « C » est un static_cast, const_cast (ou const_cast suivi de
static_cast) ou un reintepret_cast. Donc, ou bien c'est accepté dans
les deux cas, ou rejeté dans les deux cas.
"kanze" <kanze@gabi-soft.fr> writes:
[...]
| > [ La notion de « conditionally supported » a entraîné un dé bat
| > chauffé, surréaliste à la réunion de Lillehammer l'année
| > dernière. ]
| Mais ce n'est pas le premier cas d'une opération qui est
| « conditionally supported », non. Si je peux convertir un
| pointeur en entier (et quel entier), par exemple.
Cela n'est pas plutôt « implementation defined » ?
La notion de « conditionally supported » a été inventée à la
dernière réunion de Lillehammer.
| > [...]
| > | exemple. (Mais pas g++ -- pour des raisons qui me dépassent, gcc
| > | supporte le cast à la C, mais g++ ne supporte pas le
| > | reinterpret_cast.)
| > Alors, tu as trouvé un bug dans le compilateur.
| Moi, je le considèrerais comme tel, mais j'avais l'impression
| que c'était plus ou moins voulu.
Un cast « C » est un static_cast, const_cast (ou const_cast suivi de
static_cast) ou un reintepret_cast. Donc, ou bien c'est accepté dans
les deux cas, ou rejeté dans les deux cas.
"kanze" writes:
[...]
| > [ La notion de « conditionally supported » a entraîné un dé bat
| > chauffé, surréaliste à la réunion de Lillehammer l'année
| > dernière. ]
| Mais ce n'est pas le premier cas d'une opération qui est
| « conditionally supported », non. Si je peux convertir un
| pointeur en entier (et quel entier), par exemple.
Cela n'est pas plutôt « implementation defined » ?
La notion de « conditionally supported » a été inventée à la
dernière réunion de Lillehammer.
| > [...]
| > | exemple. (Mais pas g++ -- pour des raisons qui me dépassent, gcc
| > | supporte le cast à la C, mais g++ ne supporte pas le
| > | reinterpret_cast.)
| > Alors, tu as trouvé un bug dans le compilateur.
| Moi, je le considèrerais comme tel, mais j'avais l'impression
| que c'était plus ou moins voulu.
Un cast « C » est un static_cast, const_cast (ou const_cast suivi de
static_cast) ou un reintepret_cast. Donc, ou bien c'est accepté dans
les deux cas, ou rejeté dans les deux cas.
*(void **)(&fptr) = dlsym(handle, "my_function");
Ce qui en C++ donne :
*reinterpret_cast< void** >( &fptr ) = dlsym(handle, "my_function"
) ;
Voilà le texte tiré du site :
The ISO C standard does not require that pointers to
functions can be cast back and forth to pointers to data.
Indeed, the ISO C standard does not require that an object of
type void * can hold a pointer to a function.
Implementations supporting the XSI extension, however, do
require that an object of type void * can hold a pointer to a
function. The result of converting a pointer to a function
into a pointer to another data type (except void *) is still
undefined, however.
Je ne comprends pas pourquoi le cast de &fptr (adresse d'un
pointeur de fonction) en un void** (adresse d'un pointeur de
données) est alors valide.
Je suppose que l'interet d'interdire le cast direct, c'est de
permettre à l'implémentation d'avoir des représentations
différentes pour des pointeurs de fonctions et de données
(disons par exemple 4 octets pour les pointeurs de données et
8 pour les pointeurs de fonction).
Dans ce cas, le code précédent ne fonctionnerait pas non plus.
*(void**)(&fptr) me semble une façon compliquée d'écrire
(void*)fptr, et je ne vois pas l'interet d'autoriser l'un et
pas l'autre.
*(void **)(&fptr) = dlsym(handle, "my_function");
Ce qui en C++ donne :
*reinterpret_cast< void** >( &fptr ) = dlsym(handle, "my_function"
) ;
Voilà le texte tiré du site :
The ISO C standard does not require that pointers to
functions can be cast back and forth to pointers to data.
Indeed, the ISO C standard does not require that an object of
type void * can hold a pointer to a function.
Implementations supporting the XSI extension, however, do
require that an object of type void * can hold a pointer to a
function. The result of converting a pointer to a function
into a pointer to another data type (except void *) is still
undefined, however.
Je ne comprends pas pourquoi le cast de &fptr (adresse d'un
pointeur de fonction) en un void** (adresse d'un pointeur de
données) est alors valide.
Je suppose que l'interet d'interdire le cast direct, c'est de
permettre à l'implémentation d'avoir des représentations
différentes pour des pointeurs de fonctions et de données
(disons par exemple 4 octets pour les pointeurs de données et
8 pour les pointeurs de fonction).
Dans ce cas, le code précédent ne fonctionnerait pas non plus.
*(void**)(&fptr) me semble une façon compliquée d'écrire
(void*)fptr, et je ne vois pas l'interet d'autoriser l'un et
pas l'autre.
*(void **)(&fptr) = dlsym(handle, "my_function");
Ce qui en C++ donne :
*reinterpret_cast< void** >( &fptr ) = dlsym(handle, "my_function"
) ;
Voilà le texte tiré du site :
The ISO C standard does not require that pointers to
functions can be cast back and forth to pointers to data.
Indeed, the ISO C standard does not require that an object of
type void * can hold a pointer to a function.
Implementations supporting the XSI extension, however, do
require that an object of type void * can hold a pointer to a
function. The result of converting a pointer to a function
into a pointer to another data type (except void *) is still
undefined, however.
Je ne comprends pas pourquoi le cast de &fptr (adresse d'un
pointeur de fonction) en un void** (adresse d'un pointeur de
données) est alors valide.
Je suppose que l'interet d'interdire le cast direct, c'est de
permettre à l'implémentation d'avoir des représentations
différentes pour des pointeurs de fonctions et de données
(disons par exemple 4 octets pour les pointeurs de données et
8 pour les pointeurs de fonction).
Dans ce cas, le code précédent ne fonctionnerait pas non plus.
*(void**)(&fptr) me semble une façon compliquée d'écrire
(void*)fptr, et je ne vois pas l'interet d'autoriser l'un et
pas l'autre.