Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

connaitre le nom de la fonction appellée

7 réponses
Avatar
GaHweL
Bonjour,

On veut inclure dans l'application, un module de log afin de logguer
toutes les actions utilisateur.

Pour cela, j'aimerais logger un certains nombre de fonctions.

Existe-t-il une fonction permettant de connaitre le nom de la fonction
lanc=E9e.

Par exemple:

void maFonction ( )
{
CString nomFonction;
.=2E..
nomFonction=3DquelleEstLaFonctionAppell=E9(); // de telle sorte que
nomFonction contienne : maFonction.
.=2E.

}

Merci pour vos =E9claircissement.

7 réponses

Avatar
Fabien LE LEZ
On 29 Jul 2005 03:34:26 -0700, "GaHweL" :

Existe-t-il une fonction permettant de connaitre le nom de la fonction
lancée.


En C++ standard, si je ne m'abuse, non.
Mais le thread qui commence par
<news:42d35b46$0$26418$ peut peut-être t'aider.

Avatar
AG
Et en C99, tu as __func__ qui permet :

printf("fonction : %sn",__func__);

AG.
Avatar
GaHweL
Bon ben , là j'ai un autre soucis. C'est à dire, qu'après avoir
voulu retrouver le nom de la fonction, j'aimerai retrouver le type
d'une structure.

par exemple:

j'ai deux type de structures, struct1 & struct2.

suivant si c'est l'une ou l'autre, j'aimerai y appliqué une opération
différente.

en fait une fonction du type sizeof, qui s'appellerai typeof, et qui
renverrais le type de la donnée passée en paramètre.

Une telle fonction exixte-t-elle ?.

Merci pour votre aide passée et future.
Avatar
kanze
GaHweL wrote:

Bon ben , là j'ai un autre soucis. C'est à dire, qu'après
avoir voulu retrouver le nom de la fonction, j'aimerai
retrouver le type d'une structure.

par exemple:

j'ai deux type de structures, struct1 & struct2.

suivant si c'est l'une ou l'autre, j'aimerai y appliqué une
opération différente.

en fait une fonction du type sizeof, qui s'appellerai typeof,
et qui renverrais le type de la donnée passée en paramètre.

Une telle fonction exixte-t-elle ?.


Elle existe. Elle s'appelle typeid, et elle renvoie un
std::type_info. (En fait, comme sizeof, c'est un opérateur, et
non une fonction.) Et la classe type_info a bien une fonction
name, ce qui veut dire que tu peut écrire des choses comme:

std::cout << typeid( *p ).name() << std::endl ;

Si le type pointé par p est polymorphique, tu aurais même le nom
du type de l'objet réel, et non le type déclaré.

La norme ne dit rien sur comment la chaine renvoyée est
formattée. Certains compilateurs te donnent quelque chose
d'utiles, d'autres non.

--
James Kanze GABI Software
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

Avatar
Fabien LE LEZ
On 1 Aug 2005 06:11:38 -0700, "GaHweL" :

j'ai deux type de structures, struct1 & struct2.


Note en passant : il n'y a pas de structures en C++, il n'y a que des
classes.
Les mots-clefs "struct" et "class" sont quasiment équivalents ; la
différence est que "struct" indique que tout est public par défaut.

Les deux codes suivants font la même chose :

struct Machin: public Truc
{
private: int n;
};


class Machin: public Truc
{
private: int n;
};


suivant si c'est l'une ou l'autre, j'aimerai y appliqué une opération
différente.


Généralement, la fonction en question est membre (éventuellement
virtuel) de la classe struct1 (ou struct2).

Une autre possibilité :

void f (struct1 const& machin)
{
...
}

void f (struct2 const& machin)
{
...
}


Un cas courant :

class struct_base { ... };
class struct1: public struct_base { ... };
class struct2: public struct_base { ... };

void f (struct_base const& machin);

int main()
{
struct1 s1;
struct2 s2;
f (s1);
f (s2);
}

void f (struct_base const& machin)
{
/*
Ici, on cherche à savoir si machin est un "struct1".
Comme je l'ai dit, l'idéal est d'avoir une fonction virtuelle de
struct_base, qui indique que faire -- ou, mieux, qui fait l'action
voulue.

Il y a toutefois une possibilité : dynamic_cast<>
*/
if (dynamic_cast<struct1 const*>(machin) != 0)
{
cerr << "machin est un struct1" << endl;
}
else
{
cerr << "machin n'est pas un struct1" << endl;
}
}

Note qu'il existe un typeof en C++ (enfin, je crois), mais j'avoue ne
l'avoir jamais utilisé, ni même être sûr de savoir à quoi il sert.

Note aussi que si struct1d dérive de struct1, alors un objet de type
struct1d _est_ un objet de type struct1.

Avatar
Falk Tannhäuser
GaHweL wrote:
j'ai deux type de structures, struct1 & struct2.

suivant si c'est l'une ou l'autre, j'aimerai y appliqué une opérati on
différente.


Il semblerait que tu cherches les fonctions membres virtuelles ?

struct StructBase
{
virtual void Operation( /* paramètres ??? */ ) = 0;
};

struct Struct1 : public StructBase
{
// Données ...
virtual void Operation( /* paramètres ??? */ );
};

void Struct1::Operation( /* paramètres ??? */ )
{
// fais quelque chose
}

struct Struct2 : public StructBase
{
// Autres données ...
virtual void Operation( /* paramètres ??? */ );
};

void Struct2::Operation( /* paramètres ??? */ )
{
// fais autre chose
}

void foo(StructBase& s)
{
s.Operation( /* ... */ ); // Appliquer l'opération qui va bien se lon le type dynamique de 's'
}

int main()
{
Struct1 s1;
Struct2 s2;
foo(s1); // Appellera Struct1::Operation()
foo(s2); // Appellera Struct2::Operation()
return 0;
}

Falk

Avatar
GaHweL
Je vais tester ça, si ça marche pas, je vous tiens au courant.
Merci beaucoup pour ces éclaircissement, vous me retirez une belle
poutre du pied.