C++, pointeurs de fonctions, fonctions membres, threads et signaux
39 réponses
vincent.lecoq
Je cherche a develloper une petite librairie en C++ sous Linux (et/ou
BSD ).
Elle a besoin des appels systeme signal et pthread_create.
La fonction associee a mon signal est un membre d'une des classes de
ma librairie, elles est appelee en interne par celle ci pour detacher
un process puis restaurer l'environement d'origine. or g++ (et le C++
en general) m'interdisent de passer cette fonction a signal car elle
est du type MaClasse::ma_fonction et comme cette fonction doit se
servir de certaines variables propres a l'instance de la classe
appelante, je ne peux par l'exterioriser ...
return "Pointeur sur fonction membre (statique)"; }
int main() {
return bar< foo >() == bar< S::foo >(); }
compile (pas d'ambiguïté). Et, à l'éxecution, ne retourne pas zéro. -- Franck Branjonneau
Gabriel Dos Reis
writes:
[...]
| > Il me semble avoir déjà utilisé une telle chose, sans avertissement. | | C'est possible. CFront ne faisait pas la distinction. Zortech, en | revanche, oui, puisque la séquence d'appel pour une fonction C++ n'était | pas la même que pour une fonction C. Le comité n'a voulu interdire les | implémentations comme Zortech (qui est quand même l'implémentation la | plus raisonable sur une architecture Intel). Du coup, le linkage fait | partie du type de la fonction.
Ce qui est une kolossale erreur.
-- Gaby
kanze@gabi-soft.fr writes:
[...]
| > Il me semble avoir déjà utilisé une telle chose, sans avertissement.
|
| C'est possible. CFront ne faisait pas la distinction. Zortech, en
| revanche, oui, puisque la séquence d'appel pour une fonction C++ n'était
| pas la même que pour une fonction C. Le comité n'a voulu interdire les
| implémentations comme Zortech (qui est quand même l'implémentation la
| plus raisonable sur une architecture Intel). Du coup, le linkage fait
| partie du type de la fonction.
| > Il me semble avoir déjà utilisé une telle chose, sans avertissement. | | C'est possible. CFront ne faisait pas la distinction. Zortech, en | revanche, oui, puisque la séquence d'appel pour une fonction C++ n'était | pas la même que pour une fonction C. Le comité n'a voulu interdire les | implémentations comme Zortech (qui est quand même l'implémentation la | plus raisonable sur une architecture Intel). Du coup, le linkage fait | partie du type de la fonction.
Ce qui est une kolossale erreur.
-- Gaby
drkm
Franck Branjonneau writes:
Et, à l'éxecution, ne retourne pas zéro.
Heu, tu es sûr ? L'égalité ne devrait pourtant pas être vérifiée, donc évaluer en false, converti en 0. Non ?
--drkm
Franck Branjonneau <fasbjx@free.fr> writes:
Et, à l'éxecution, ne retourne pas zéro.
Heu, tu es sûr ? L'égalité ne devrait pourtant pas être vérifiée,
donc évaluer en false, converti en 0. Non ?
Heu, tu es sûr ? L'égalité ne devrait pourtant pas être vérifiée, donc évaluer en false, converti en 0. Non ?
--drkm
drkm
writes:
En revanche, le type d'une fonction membre statique n'est pas celui d'une fonction membre.
Bien sûr.
Donc, si j'écris :
struct C { static void* h( void* ) ; } ;
&C::h a le même type que f, ci-dessus. Et on peut en servir partout où on pourrait se servir de f.
Le type d'une fonction memebre statique est le même que celui d'une fonction libre, par ailleurs de même signature ? Je pensais que ce n'était pas le cas. Je n'ai pas de référence dans la norme, et ne sais pas à vrai dire où chercher. As-tu une référence ?
--drkm
kanze@gabi-soft.fr writes:
En revanche, le type d'une fonction membre statique n'est pas celui
d'une fonction membre.
Bien sûr.
Donc, si j'écris :
struct C
{
static void* h( void* ) ;
} ;
&C::h a le même type que f, ci-dessus. Et on peut en servir partout où
on pourrait se servir de f.
Le type d'une fonction memebre statique est le même que celui d'une
fonction libre, par ailleurs de même signature ? Je pensais que ce
n'était pas le cas. Je n'ai pas de référence dans la norme, et ne
sais pas à vrai dire où chercher. As-tu une référence ?
En revanche, le type d'une fonction membre statique n'est pas celui d'une fonction membre.
Bien sûr.
Donc, si j'écris :
struct C { static void* h( void* ) ; } ;
&C::h a le même type que f, ci-dessus. Et on peut en servir partout où on pourrait se servir de f.
Le type d'une fonction memebre statique est le même que celui d'une fonction libre, par ailleurs de même signature ? Je pensais que ce n'était pas le cas. Je n'ai pas de référence dans la norme, et ne sais pas à vrai dire où chercher. As-tu une référence ?
--drkm
drkm
Gabriel Dos Reis writes:
writes:
[...]
| > Il me semble avoir déjà utilisé une telle chose, sans avertissement.
| C'est possible. CFront ne faisait pas la distinction. Zortech, en | revanche, oui, puisque la séquence d'appel pour une fonction C++ n'était | pas la même que pour une fonction C. Le comité n'a voulu interdire les | implémentations comme Zortech (qui est quand même l'implémentation la | plus raisonable sur une architecture Intel). Du coup, le linkage fait | partie du type de la fonction.
Ce qui est une kolossale erreur.
Quoi ? De faire intervenir le linkage dans le type d'une fonction ?
--drkm
Gabriel Dos Reis <gdr@cs.tamu.edu> writes:
kanze@gabi-soft.fr writes:
[...]
| > Il me semble avoir déjà utilisé une telle chose, sans avertissement.
| C'est possible. CFront ne faisait pas la distinction. Zortech, en
| revanche, oui, puisque la séquence d'appel pour une fonction C++ n'était
| pas la même que pour une fonction C. Le comité n'a voulu interdire les
| implémentations comme Zortech (qui est quand même l'implémentation la
| plus raisonable sur une architecture Intel). Du coup, le linkage fait
| partie du type de la fonction.
Ce qui est une kolossale erreur.
Quoi ? De faire intervenir le linkage dans le type d'une fonction ?
| > Il me semble avoir déjà utilisé une telle chose, sans avertissement.
| C'est possible. CFront ne faisait pas la distinction. Zortech, en | revanche, oui, puisque la séquence d'appel pour une fonction C++ n'était | pas la même que pour une fonction C. Le comité n'a voulu interdire les | implémentations comme Zortech (qui est quand même l'implémentation la | plus raisonable sur une architecture Intel). Du coup, le linkage fait | partie du type de la fonction.
Ce qui est une kolossale erreur.
Quoi ? De faire intervenir le linkage dans le type d'une fonction ?
--drkm
Franck Branjonneau
écrivait:
Franck Branjonneau wrote in message news:...
Non, la différence entre le *type* d'un pointeur vers une fonction membre statique et le *type* d'un pointeur vers une fonction libre.
Il n'y en a pas.
Yep.
Qu'est-ce qui te fait penser qu'il y en a ?
Je croyais avoir réussi à les distinguer. -- Franck Branjonneau
kanze@gabi-soft.fr écrivait:
Franck Branjonneau <fasbjx@free.fr> wrote in message
news:<87y8lzzkqb.fsf@alpha.tchume.net>...
Non, la différence entre le *type* d'un pointeur vers une fonction
membre statique et le *type* d'un pointeur vers une fonction libre.
Il n'y en a pas.
Yep.
Qu'est-ce qui te fait penser qu'il y en a ?
Je croyais avoir réussi à les distinguer.
--
Franck Branjonneau <fasbjx@free.fr>
J'ai annnulé le message auquel tu réponds. -- Franck Branjonneau
Alain Naigeon
"drkm" a écrit dans le message news:
Le type d'une fonction memebre statique est le même que celui d'une fonction libre, par ailleurs de même signature ? Je pensais que ce n'était pas le cas. Je n'ai pas de référence dans la norme, et ne sais pas à vrai dire où chercher. As-tu une référence ?
J'ai trouvé ceci, dans lequel la note de bas de page 57 semble répondre :
<citation>
[expr.call] 5.2.2 Function call 1 There are two kinds of function call: ordinary function call and member function57) (9.3) call. A function call is a postfix expression followed by parentheses containing a possibly empty, commaseparated list of expressions which constitute the arguments to the function. For an ordinary function call, the postfix expression shall be either an lvalue that refers to a function (in which case the functiontopointer standard conversion (4.3) is suppressed on the postfix expression), or it shall have pointer to function type. Calling a function through an expression whose function type has a language linkage that is different from the __________________ 56) This is true even if the subscript operator is used in the following common idiom: &x[0]. 57) A static member function (9.4) is an ordinary function.
</citation>
C'est vachement sobre, mais très clair ;-) Remarquons tout de même l'absence d'une définition précise de "ordinary" (du moins dans ce passage). A moins de définir "ordinary" par "autre que nonstatic", ce qu'un dictionnaire n'hésiterait pas à faire, mais ici on reste un peu sur sa faim...
--
Français *==> "Musique renaissance" <==* English midi - facsimiles - ligatures - mensuration http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/ Alain Naigeon - - Strasbourg, France
"drkm" <usenet.fclcxx@fgeorges.org> a écrit dans le message news:
wkoemu4ovz.fsf@fgeorges.org...
Le type d'une fonction memebre statique est le même que celui d'une
fonction libre, par ailleurs de même signature ? Je pensais que ce
n'était pas le cas. Je n'ai pas de référence dans la norme, et ne
sais pas à vrai dire où chercher. As-tu une référence ?
J'ai trouvé ceci, dans lequel la note de bas de page 57 semble
répondre :
<citation>
[expr.call] 5.2.2 Function call
1 There are two kinds of function call: ordinary function call and member
function57) (9.3) call. A function
call is a postfix expression followed by parentheses containing a possibly
empty, commaseparated
list of
expressions which constitute the arguments to the function. For an ordinary
function call, the postfix
expression shall be either an lvalue that refers to a function (in which
case the functiontopointer
standard
conversion (4.3) is suppressed on the postfix expression), or it shall have
pointer to function type. Calling a
function through an expression whose function type has a language linkage
that is different from the
__________________
56) This is true even if the subscript operator is used in the following
common idiom: &x[0].
57) A static member function (9.4) is an ordinary function.
</citation>
C'est vachement sobre, mais très clair ;-)
Remarquons tout de même l'absence d'une définition précise
de "ordinary" (du moins dans ce passage). A moins de définir
"ordinary" par "autre que nonstatic", ce qu'un dictionnaire
n'hésiterait pas à faire, mais ici on reste un peu sur sa faim...
--
Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - anaigeon@free.fr - Strasbourg, France
Le type d'une fonction memebre statique est le même que celui d'une fonction libre, par ailleurs de même signature ? Je pensais que ce n'était pas le cas. Je n'ai pas de référence dans la norme, et ne sais pas à vrai dire où chercher. As-tu une référence ?
J'ai trouvé ceci, dans lequel la note de bas de page 57 semble répondre :
<citation>
[expr.call] 5.2.2 Function call 1 There are two kinds of function call: ordinary function call and member function57) (9.3) call. A function call is a postfix expression followed by parentheses containing a possibly empty, commaseparated list of expressions which constitute the arguments to the function. For an ordinary function call, the postfix expression shall be either an lvalue that refers to a function (in which case the functiontopointer standard conversion (4.3) is suppressed on the postfix expression), or it shall have pointer to function type. Calling a function through an expression whose function type has a language linkage that is different from the __________________ 56) This is true even if the subscript operator is used in the following common idiom: &x[0]. 57) A static member function (9.4) is an ordinary function.
</citation>
C'est vachement sobre, mais très clair ;-) Remarquons tout de même l'absence d'une définition précise de "ordinary" (du moins dans ce passage). A moins de définir "ordinary" par "autre que nonstatic", ce qu'un dictionnaire n'hésiterait pas à faire, mais ici on reste un peu sur sa faim...
--
Français *==> "Musique renaissance" <==* English midi - facsimiles - ligatures - mensuration http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/ Alain Naigeon - - Strasbourg, France
drkm
"Alain Naigeon" writes:
There are two kinds of function call: ordinary function call and member function 57) (9.3) call.
[...]
57) A static member function (9.4) is an ordinary function.
C'est exactement ce que je cherchais. Merci.
De mon côté, je me suis entre-temps rendu compte de mon erreur, grâce au bout de code suivant, que j'allais justement poster :