OVH Cloud OVH Cloud

C++, pointeurs de fonctions, fonctions membres, threads et signaux

39 réponses
Avatar
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 ...

Comment faire ?

10 réponses

1 2 3 4
Avatar
Franck Branjonneau
écrivait:

Franck Branjonneau wrote in message
news:...
James Kanze écrivait:
"Arnaud Debaene" writes:
|> drkm wrote:

|> > Un pointeur vers une fonction membre statique n'est pas de
|> > même type qu'un pointeur vers une fonction libre.

|> Ah? C'est quoi la différence (d'après la norme) ?

La différence entre une fonction avec linkage "C", et une fonction
sans linkage "C" ?


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.


Uh ?

Qu'est-ce qui te fait penser qu'il y en a ?


void foo() {}

struct S {

static void foo() {}

};


template< void (* _foo)() >
char const *
bar() {

return "Pointeur sur fonction libre";
}

template< void (S::* _foo)() >
char const *
bar() {

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



Avatar
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
Avatar
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

Avatar
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

Avatar
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

Avatar
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


Avatar
Franck Branjonneau
drkm écrivait:

[...]


J'ai annnulé le message auquel tu réponds.
--
Franck Branjonneau

Avatar
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

Avatar
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 :

~> cat fclcxx.cc
#include <iostream>
#include <ostream>
#include <typeinfo>

void foo() {
}

struct S {
static void foo() {
}
} ;

int main() {
std::cout.setf( std::ostream::boolalpha ) ;
std::cout
<< "equality: "
<< ( typeid( foo ) == typeid( S::foo ) )
<< std::endl ;
}

~> g++ --version | head -n 1
g++ (GCC) 3.3.1 (cygming special)

~> g++ -o fclcxx fclcxx.cc -Wall -ansi -pedantic

~> ./fclcxx
equality: true

Désolé pour la confusion, et merci pour la correction.

Heu, au fait, j'ai maintenant du mal à comprendre l'article de Gaby
...

--drkm

Avatar
Alain Naigeon
"drkm" a écrit dans le message news:

Heu, au fait, j'ai maintenant du mal à comprendre l'article de Gaby


C'est une sérieuse garantie d'authenticité :-) :-)

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France

1 2 3 4