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

Connaitre l'empilement des fonctions en C

17 réponses
Avatar
ALain Montfranc
Bonsoir

Existe t'il un moyen portable (ou semi portable) de connaitre la pile
des fonctions appelées ou, a défaut, le nom de la fonction en cours ?

(objectif : messages de debug)

Merci

7 réponses

1 2
Avatar
Pascal Bourguignon
"Jean Pierre Daviau" writes:

cat f.c && make f && ./f


C'est quoi cat?


man cat

En supposant que tu ne connaisses pas unix, tu pourrais par exemple
t'inscrire sur un "freeshell", un serveur unix donnant des comptes
utilisateurs gratuits. (google: unix freeshell ; il y en a des tonnes).

Sur MS-Windows, on peut utiliser PuTTY pour se connecter à un serveur
distant. http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

Une fois connecté, tu peux taper des commandes. En particulier, la
commande man affiche la page de manuel concernant la commande ou la
fonction passée en argument. Tu peux taper des commandes comme:

man man
man cat
man cc


Une autre solution, si tu ne veux pas investir autant (mais je te le
conseille!), serait simplement d'utiliser google: manual "cat(1)"

Sur unix, les commandes utilisateurs sont dans la section 1 du manuel,
d'où cat(1). Les appels systèmes dans la section 2 (ex.: open(2)),
les fonctions de bibliothèque dans la section 3 (ex.: printf(3)).

--
__Pascal Bourguignon__ http://www.informatimago.com/

READ THIS BEFORE OPENING PACKAGE: According to certain suggested
versions of the Grand Unified Theory, the primary particles
constituting this product may decay to nothingness within the next
four hundred million years.


Avatar
ALain Montfranc
Pascal Bourguignon a écrit

Une autre solution,


Sans oublier l'excellentissime cygwin

Avatar
Antoine Leca
Marc Espie écrivit dans news:eq4trn$6eo$:
__func__, c'est du C99, une norme sortie il y a maintenant 8 ans.


Mon fils te dirait /sept/.
Lui est né en 1998, et il insiste sur ses 8 ans, pas 9 :-)

Sinon, si on veut chipoter dans l'autre sens, __func__ est présent stable et
tout (donc les implémenteurs étaient avertis) depuis les brouillons de mi-98
(FCD), donc en fait cela fait bientôt 9 ans.


Cela étant, un compilateur C souvent utilisé ces jours-ci est celui de MS,
dont la dernière moûture (sortie en 2005, « Visual Studio 2005 » aka VS8 aka
CL v14.0 aka Whitbey, qui vise une «meilleure» conformité aux normes,
d'abord C++:1998 et dans un second temps seulement C99) ne supporte pas
__func__. Rappelons que CL14 ne définit pas __STDC_VERSION__, ce qui
implique seulement la conformité C90.

Depuis CLv.12 (VS7.1 "2002"), on peut utiliser à la place __FUNCTION__ (qui
est candidat au support dans la norme C++). Donc, une solution peut être de
rajouter

#if defined _MSC_VER && _MSC_VER>00
#define __func__ __FUNCTION__
#endif

Laid mais cela fonctionne.

J'ai lu par ailleurs que Borland avait sa propre idée sur la question, sous
la forme __FUNC__... (pourquoi pas après tout). Si cela peut vous dépannez.


Vivement qu'ils alignent.


Antoine

Avatar
Thierry Boudet
On 2007-02-04, Marc Espie wrote:

__func__, c'est du C99, une norme sortie il y a maintenant 8 ans.
Il y a des bouts de la norme qui sont coton a implementer, mais pas
__func__. Tout compilo qui n'a pas encore __func__ dans ses cartons
sent furieusement le sapin...


Question idiote:
printf("%s %d %sn", __FILE__, __LINE__, __func__);
D'où vient ce mélange majuscule/minuscule ?

--
Ça, c'est bien du Loïc. 1 volume d'huile de foie de morue,
6 à 7 volumes d'eau, et il appelle ça du pastis.
-+- AL in fmbl - Bien configurer son pastis -+-

Avatar
Antoine Leca
Thierry Boudet écrivit dans news::
On 2007-02-04, Marc Espie wrote:

__func__, c'est du C99, une norme sortie il y a maintenant 8 ans.


printf("%s %d %sn", __FILE__, __LINE__, __func__);
D'où vient ce mélange majuscule/minuscule ?


__LINE__ et compagnie sont des symboles « normaux » du préprocesseur,
utilisables par exemple (sous réserve des règles de compatibilité de types)
dans des expressions #if ou les initialisations externes etc. Dans la nuit
des temps et au profond des labos Sonnerie il fut décidé que pour distinguer
ces symboles des autres on utiliserait de préférence des capitales.

__func__ au contraire est une sorte de variable automatique, définie
uniquement à l'intérieur d'une définition de fonction (on se demande bien ce
que cela pourrait représenter ailleurs !) et inutilisable par exemple dans
une expression #if (et pas seulement parce que c'est une chaîne de
caractères). Suivant les mêmes conventions que ci-dessus, et aussi pour bien
faire la différence avec les autres symboles « pleins de soulignés », le
comité a choisi logiquement une orthographe en minuscules.


Antoine


Avatar
espie
In article ,
Thierry Boudet wrote:
On 2007-02-04, Marc Espie wrote:

__func__, c'est du C99, une norme sortie il y a maintenant 8 ans.
Il y a des bouts de la norme qui sont coton a implementer, mais pas
__func__. Tout compilo qui n'a pas encore __func__ dans ses cartons
sent furieusement le sapin...


Question idiote:
printf("%s %d %sn", __FILE__, __LINE__, __func__);
D'où vient ce mélange majuscule/minuscule ?


Ca rappelle que __FILE__, __LINE__ et __func__ n'ont pas exactement
le meme statut. __FILE__ et __LINE__ sont entierement geres par le
preprocesseur, tandis que __func__ est un identifiant reconnu du C,
qui se trouve avoir comme valeur le nom de la fonction courante,
ce qui, si on y reflechit, est parfaitement logique et coherent:
le preprocesseur ne sait pas ce qu'est une fonction.


Avatar
Thierry Boudet
On 2007-02-19, Marc Espie wrote:

Question idiote:
printf("%s %d %sn", __FILE__, __LINE__, __func__);
D'où vient ce mélange majuscule/minuscule ?


Ca rappelle que __FILE__, __LINE__ et __func__ n'ont pas exactement
le meme statut. __FILE__ et __LINE__ sont entierement geres par le
preprocesseur, tandis que __func__ est un identifiant reconnu du C,


Et peut donc être vu, en gros, comme une chaine constante ?

qui se trouve avoir comme valeur le nom de la fonction courante,
ce qui, si on y reflechit, est parfaitement logique et coherent:
le preprocesseur ne sait pas ce qu'est une fonction.


Pourtant, on pourrait faire de belles craderies...

-------------------------------------
int plop(int v)
{
printf("v = %dn", v);
if (v > 5)
return v;
return __func__(v+1);
}
-------------------------------------

Merci à vous deux pour vos éclaircissements.


--
+-----------------------------------------+
| http://tontonth.free.fr/plop/ |
+-----------------------------------------+


1 2